6

我已经多次遇到这个问题,但还没有找到解决问题的“MySQL 方式”——我有一个包含用户报告的数据库。每个报告都有一个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,因为它的外键权重很大。当我添加第二个自动增量字段时,它似乎在抱怨,但我不确定是否有其他方法可以做到这一点?

4

4 回答 4

9

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 |
+--------+----+---------+
于 2013-11-05T11:48:07.273 回答
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 ;
于 2021-01-29T01:57:38.150 回答
0

我认为 mysql 不支持两个 auto_increment 列。您可以使用信息架构创建报告编号。

select NULL from information_schema.columns  
于 2013-11-05T10:29:36.507 回答
-1

MySQl 不支持两个自增字段,如果需要再创建一个表,将另一个字段设置为自增,并且必须与这两个表建立关系。

于 2013-11-05T11:34:39.960 回答