2011-05-26 66 views
3

另一個問題是今天:)自動遞增
這一次,我想知道是否/如何可能進行第二次列自動增量爲每個主鍵:MySQL中使用非主鍵

CREATE TABLE test (
    `id` INTEGER UNSIGNED NOT NULL, 
    `subId` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, 
    `text` VARCHAR(45) NOT NULL, 
    PRIMARY KEY (`id`, `subId`) 
) 
ENGINE = InnoDB; 

此創作,不幸的是,不工作,只有當我指定ID作爲主鍵和subId作爲索引鍵(但我需要他們兩個在一起,ID可以重複......)
實例數據(我需要什麼) :

1, 1 
1, 2 
1, 3 
2, 1 
2, 2 
3, 1 

使ID小學和subId指數的問題是,subId將獨立於ID增量。
如何做到這一點,甚至可能嗎?

+0

MAKE'ID'和'SUBID'在一起的唯一密鑰 – diEcho 2011-05-26 13:07:57

+0

'CREATE TABLE test2的( ID整數UNSIGNED NOT NULL, SUBID INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, 文本VARCHAR(45)NOT NULL, UNIQUE INDEX ABC(引擎= InnoDB;' - 表格定義不正確;只能有一個自動列,它必須被定義爲一個鍵。 – jurchiks 2011-05-26 14:37:19

回答

2

我不得不處理類似的問題不自然排序類別樹。 如果你是在同一時間插入一個ID的所有行,你可以爲每個SUBID做這樣的事情:

SET @seq = 0; 
INSERT INTO test 
    (id, subId,   text) VALUES 
    (_id, @seq := @seq + 1, 'Some text') 
; 

如果你需要一排「添加」到一個id,你可以設置@seq與

SELECT IFNULL(MAX(subId), 0) INTO @seq FROM test WHERE id = _id; 

這當然需要由應用程序管理id而不是mySQL。

您可以像上一個代碼塊一樣獲取下一個可用的id。

2

它可能不是你想要的,它只適用於MyISAM和BDB表,但我認爲最接近你要求的是一個分組主鍵。

manual

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; 
Which returns: 
+--------+----+---------+ 
| grp | id | name | 
+--------+----+---------+ 
| fish | 1 | lax  | 
| mammal | 1 | dog  | 
| mammal | 2 | cat  | 
| mammal | 3 | whale | 
| bird | 1 | penguin | 
| bird | 2 | ostrich | 
+--------+----+---------+ 
+0

我使用的InnoDB和枚舉ID不是我正在尋找,所以我想它不會爲我飛。但也許別人會發現它有用:) – jurchiks 2011-05-26 14:34:42