当前位置: 首页 > 面试题库 >

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

东门秦迟
2023-03-14
问题内容

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

主要的抱怨是,用户对于为什么系统中缺少报告感到困惑。实际上并非如此。实际上,他们正在识别其ID之间的间隙,并假定这些ID缺少报告,而实际上,这仅仅是因为其他用户已填补了此自动递增的间隙。

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

我是否可以有一个 第二个 自动递增字段,称为 report_number ,它 基于一个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 |
+--------+----+---------+


 类似资料:
  • 问题内容: 是否可以自动增加非主密钥? 表“ book_comments” 该表上将没有其他索引。但是,我想使列自动递增,以便可以轻松创建另一个表: 表格“ book_comments_votes” 用户将只能对每个书评进行一次投票。该表通过主键强制执行此规则。 题: 是否可以自动增加非主键-例如,自动增加表“ book_comments”中的列? 替代方案,讨论: 如上所述,我想这样做是为了简化

  • 问题内容: 我正在使用php和mysql。我有一个表,其中id列设置为自动递增作为主键。我正在尝试添加另一个名为sort_order的列。插入行后,sort_order列应自动递增。然后,用户将能够更改sort_order值。但是mysql不允许多于一列的自动递增? 自动递增sort_order值的最佳方法是什么? 受欢迎的要求,更多的解释。 在管理区域中,用户将具有类别列表。用户可以使用java

  • 问题内容: 我正在寻找这样的查询: id | int | 自动增量 varchar | 255 这样桌子就看起来像 1 | val1 2 | val2 3 | val3 … 除了id总是以每一行都结束而已。 我怎样才能做到这一点? 问题答案:

  • 问题内容: 这可能在MySql中吗?我可以有一个以字母为前缀的自动递增主键,例如R1234,R1235,R1236 …等等吗? 问题答案: 您可以做的是将密钥存储为两列。一个char前缀和一个auto-incrementing int,它们都被分组为主键。

  • 问题内容: 我有多个结构相同的数据库,有时会在其中复制数据。为了保持数据完整性,我使用两列作为主键。一个是数据库ID,它链接到包含有关每个数据库的信息的表。另一个是表键。它不是唯一的,因为它可能有多个行,且此值相同,但database_id列中的值不同。 我打算将这两列变成一个联合主键。但是,我也想将表键设置为自动递增-但基于database_id列。 EG,使用以下数据: 如果我要添加包含dab

  • 问题内容: 我正在尝试在mysql数据库中创建一列,该列自动递增1但从0-Z开始然后滚动。 例如000、001、002,…,009、00A,00B,…,00Z,010,…,0ZZ,…,100。 我想让数据库通过自动递增字段创建列。 我的想法是: 为从0到36的每个字符创建一列,然后将行N(其中N是最低有效数字)自动递增1。然后在每列上添加触发器,以在第N列达到36时向N-1列添加1 。 创建一个包