如何在MySQL中生成动态序列表?

问题描述:

我试图在MySQL中生成一个序列表,以便我可以从last_insert_id获得唯一的ID。如何在MySQL中生成动态序列表?

问题是我需要动态多个序列。


在第一次,我创建了一个表:

CREATE TABLE `sequence` (
    `label` char(30) CHARACTER SET latin1 NOT NULL, 
    `id` mediumint(9) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`label`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 

然后试图让数量,使用例如由http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id

UPDATE sequence SET id = LAST_INSERT_ID(id + 1) WHERE label = 'test'; 
SELECT LAST_INSERT_ID(); 

一段时间,我意识到,我还经过需要安全地为新标签生成行。 所以我改变了这种模式为:

CREATE TABLE `sequence` (
    `label` char(30) CHARACTER SET latin1 NOT NULL, 
    `id` mediumint(9) NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`label`,`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 

,我根本放弃使用WHERE子句来更新其ID。

INSERT INTO sequence (label) values (?) 
SELECT LAST_INSERT_ID() 

这是一个正确的方法吗?我想知道是否有更好的解决方案。

+0

MariaDB的10.3将支持序列(https:// mariadb。 com/kb/en/library/sequences /) – 2017-12-27 19:43:42

MyISAM引擎会为你做它 -

表定义:

CREATE TABLE `sequence` (
    `label` char(30) CHARACTER SET latin1 NOT NULL, 
    `id` mediumint(9) NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`label`,`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

填充表:

INSERT INTO sequence VALUES ('a', NULL); -- add some 'a' labels 
INSERT INTO sequence VALUES ('a', NULL); 
INSERT INTO sequence VALUES ('a', NULL); 

INSERT INTO sequence VALUES ('b', NULL); -- add another labels 'b' 
INSERT INTO sequence VALUES ('b', NULL); 

INSERT INTO sequence VALUES ('a', NULL); -- add some 'a' labels 
INSERT INTO sequence VALUES ('a', NULL); 

显示结果:

SELECT * FROM sequence; 
+-------+----+ 
| label | id | 
+-------+----+ 
| a  | 1 | 
| a  | 2 | 
| a  | 3 | 
| a  | 4 | 
| a  | 5 | 
| a  | 6 | 
| b  | 1 | 
| b  | 2 | 
+-------+----+ 
+0

谢谢Devart。它是否也适用于InnoDB?或以其他方式? – ernix 2012-01-31 00:13:48

+2

InnoDb中自动增量机制的行为与MyISAM的不同之处在于:并且CREATE TABLE会抛出一个错误 - '错误1075(42000):错误的表定义;只能有一个自动列,并且必须将其定义为键“。 – Devart 2012-01-31 07:56:45

+0

谢谢,我明白了:) – ernix 2012-01-31 14:42:46