我已经多次遇到过这个问题,但是没有找到解决问题的“MySQL方式” - 我有一个包含用户和报告的数据库。每个报告都有 ID ,我向用户显示报告编号。
主要抱怨是,用户对于系统中丢失报告的原因感到困惑。事实并非如此。实际上,他们正在认识到他们的ID之间的差距,并假设这些是缺失的报告,而实际上,这只是因为另一个用户填补了这个自动递增的差距。
我需要知道在MySQL中是否有办法做到这一点:
我是否可以拥有名为 report_number 的第二自动增量字段,该字段基于具有不同的user_id 字段每个用户的自动增量集?
e.g。
|------|---------|---------------|
| 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 ,因为外键非常重。当我添加第二个自动增量字段时,它似乎会抱怨,但我不确定是否有不同的方法来执行此操作?
答案 0 :(得分:6)
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 |
+--------+----+---------+
答案 1 :(得分:1)
正确的带有 IFNULL 的:
DELIMITER $$
CREATE TRIGGER salons_trigger
BEFORE INSERT ON salon
FOR EACH ROW BEGIN
SET NEW.salon_id = IFNULL((SELECT MAX(salon_id) + 1 FROM salon WHERE owner = NEW.owner), 1);
END $$
DELIMITER ;
答案 2 :(得分:0)
我认为mysql不支持两个auto_increment列。您可以使用信息架构创建报告编号。
select NULL from information_schema.columns
答案 3 :(得分:0)
MySQl不支持两个自动递增的字段,如果需要,则创建另一个表,将另一个字段设置为自动递增,并且必须与这两个表建立关系。