MySQL第二个基于外键的自增字段

标签 mysql sql database-design relational-database innodb

我已经多次遇到这个问题,但还没有找到解决问题的“MySQL 方式”——我有一个包含用户报告.每个报告都有一个id,我将其作为报告编号显示给我的用户。

主要的提示是用户对系统中报告丢失的原因感到困惑。实际情况并非如此。实际上,他们正在识别他们的 ID 之间的差距,并假设这些是缺失的报告,而实际上,这仅仅是因为另一个用户填补了这个自动递增的差距。

我需要知道在 MySQL 中是否有办法做到这一点:

我是否可以有一个名为 report_numbersecond 自动递增字段,它基于 user_id 字段,它具有不同的每个用户的一组自动增量?

例如

|------|---------|---------------|
|  id  | user_id | report_number |
|------|---------|---------------|
|  1   |    1    |       1       |
|  2   |    1    |       2       |
|  3   |    1    |       3       |
|  4   |    2    |       1       |
|  5   |    1    |       4       |
|  6   |    1    |       5       |
|  7   |    2    |       2       |
|  8   |    3    |       1       |
|  9   |    3    |       2       |
|------|---------|---------------|

我为此使用 InnoDB,因为它非常重视外键。当我添加第二个自动递增字段时它似乎在提示,但我不确定是否有其他方法可以做到这一点?

最佳答案

MyISAM 支持第二列自动递增,但 InnoDB 不支持

对于 InnoDB,您可以创建一个触发器 BEFORE INSERT 以获取 reportid 的最大值并将该值加一。

DELIMITER $$
CREATE TRIGGER report_trigger
BEFORE INSERT ON reports
FOR EACH ROW BEGIN
    SET NEW.`report_id` = (SELECT MAX(report_id) + 1 FROM reports WHERE user_id = NEW.user_id);
END $$
DELIMITER ;

如果你可以改用MyISAM,在MySQL页面的文档中有一个例子:

http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html

CREATE TABLE animals (
    grp ENUM('fish','mammal','bird') NOT NULL,
    id MEDIUMINT NOT NULL AUTO_INCREMENT,
    name CHAR(30) NOT NULL,
    PRIMARY KEY (grp,id)
) ENGINE=MyISAM;

INSERT INTO animals (grp,name) VALUES
    ('mammal','dog'),('mammal','cat'),
    ('bird','penguin'),('fish','lax'),('mammal','whale'),
    ('bird','ostrich');

SELECT * FROM animals ORDER BY grp,id;

哪个返回:

+--------+----+---------+
| grp    | id | name    |
+--------+----+---------+
| fish   |  1 | lax     |
| mammal |  1 | dog     |
| mammal |  2 | cat     |
| mammal |  3 | whale   |
| bird   |  1 | penguin |
| bird   |  2 | ostrich |
+--------+----+---------+

关于MySQL第二个基于外键的自增字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19786665/

相关文章:

database - 是否有任何用于 mysql/sqlite/postgresql 的 SQL 设计器(用于 linux 或基于 web 的)?

mysql - 这个Mysql条件连接可能吗?

mysql - SQL - 比较表上不同日期的销售额差异

mysql - Ruby on Rails 中的读取锁定

c# - 我可以使用什么技术来存储数据

mysql - 如何将列中多次出现的“同名”显示为行中的单个名称

c# - 如何在 C# Asp.net 中将 SELECT sql 查询结果保存在数组中

mysql - 在表中创建一个数据类型,该数据类型是对其他表的引用的列表

mysql - 用于根据其他列值将数据插入列的sql

SQL 按字母顺序列出所有列名