2016-11-29 23 views
1

我在我的db "id" int(11) NOT NULL AUTO_INCREMENT,中有一列,並且我希望此表中的多行具有相同的id值。所以當插入表格時,我想告訴它是否應該增加或者值仍然是痙攣。有沒有簡單的方法如何做到這一點?僅在需要時才使用自動增量

+0

不應該是'\'id \'int(11)NOT NULL AUTO_INCREMENT,'? –

+0

當它是'id'時,它應該是唯一的,不是嗎? –

+0

是的,我很抱歉錯誤的語法,但在這裏並不重要。好吧,我可以更改ID列的名稱,但問題的想法仍然一樣,不是嗎? :-)另一件事是,只有@sagi在答案中說的auto_increment只能用於唯一值。 –

回答

1

auto_increment MySQL的文件說,(高亮是我的):

沒有值的AUTO_INCREMENT列指定的,所以MySQL 自動分配序號。除非啓用了 NO_AUTO_VALUE_ON_ZERO SQL模式,否則您還可以明確地將 指定給該列以生成序列號。如果該列被聲明爲 NOT NULL,那麼也可以將NULL分配給該列以生成 序列號。 將任何其他值插入到一個 AUTO_INCREMENT列中時,該列將設置爲該值,並且將重置 序列,以便下一個自動生成的值 從最大列值開始依次跟隨。

這意味着,如果你在插入之前確定的AUTO_INCREMENT字段的當前最大和你明確地插入插入語句該值,那麼您可以在AUTO_INCREMENT的領域有重複的值。

那裏,你需要注意的幾件事情:

  1. 如果你能有平行插入到表中,那麼你可能要鎖定表的讀數,所以其他進程不會插入一個新的記錄觸發了該領域的增量。

  2. 您不能在auto_increment字段使用主/唯一索引約束。

另一種方法是爲auto_increment設置一個單獨的表,而不要在主表中使用auto_increment。如果你需要一個新的id,那麼只需要在auto_ncrement表中插入一條記錄即可得到遞增的id,並用它將記錄插入到主表中。否則,只需從主表中獲取id值並在插入中使用它。

+0

謝謝,我使用了替代解決方案,看起來很好。 –

0

一個auto_increment列確保其中的值是唯一!所以,你不能這樣做。

我會建議一個觸發器,結合所需的邏輯。

+0

謝謝,你能展示一個觸發器的例子嗎? –

+0

那麼,我不知道什麼是標準,所以沒有。 – sagi

0

對於MyISAM表,您可以在多列索引中的輔助列上指定AUTO_INCREMENT。在這種情況下,AUTO_INCREMENT列的生成值計算爲MAX(auto_increment_column)+ 1 WHERE prefix = given-prefix。當您想要將數據放入有序組時,這非常有用。

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:  
**grep id name**  
fish 1 lax  
mammal 1 dog  
mammal 2 cat  
mammal 3 whale  
bird 1 penguin  
bird 2 ostrich  

如果AUTO_INCREMENT列是多個索引的一部分,MySQL的使用隨AUTO_INCREMENT列開始,如果有一個索引生成的序列值。例如,如果動物表包含索引PRIMARY KEY(grp,id)和INDEX(id),則MySQL將忽略用於生成序列值的PRIMARY KEY。其結果是,該表將包含一個序列,每GRP值不是一個序列

相關問題