2012-01-30 86 views
1

我試圖在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

回答

3

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