2016-08-03 142 views
3

下面是表的格式:如何根據MySQL的一組中添加自動遞增ID

indexer group name id 
1  abc a 
2  abc b 
3  xyz c 
4  abc e 
5  xyz d 

現在我希望它像,

indexer group name id 
1  abc a 1 
2  abc b 2 
3  xyz c 1 
4  abc e 3 
5  xyz d 2 

「ID」應自動根據 「組」

+0

在MySQL中不可能。你可以編寫一個存儲過程來執行計算下一個id的'INSERT',但是你可能會更好地從外部生成序列;無論你用什麼程序來插入數據。 –

+0

無論如何,它沒有什麼意義,你想要做什麼? – polku

+0

哦!哪裏有可能? –

回答

0

增加試試這個:

update yourtable t1 
join (
    select 
      tt.indexer, @rowno := if(@grp = `group`, @rowno + 1, 1) as id, @grp := `group` 
    from (select * from yourtable order by `group`, indexer) tt 
    cross join (select @rowno := 0, @grp := null) t 
) t2 
on t1.indexer = t2.indexer 
set t1.id = t2.id 

Demo Here

編輯:

如果要插入新行,你必須做這樣的:

insert into yourtable 
select '$indexer', '$group', '$name', coalesce(max(id), 0) + 1 
from yourtable 
where name = '$name' 
+0

謝謝。是的,它的工作... –

+0

後來當我插入一個新的行,將「ID」自動插入數字或我必須再次運行代碼? –

+0

@HeiderKumar檢查***編輯***部分。 – Blank

1

如果你想使用一個內置的功能,你必須使用MyISAM表。但請注意,那些不支持事務並使用表級鎖等。您可能需要閱讀相關內容。如果你對它很好,這是如何。如果你想使用InnoDB或其他引擎,你將不得不編寫自己的解決方案,即存儲過程。從manual

引用:

對於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: 

+--------+----+---------+ 
| grp | id | name | 
+--------+----+---------+ 
| fish | 1 | lax  | 
| mammal | 1 | dog  | 
| mammal | 2 | cat  | 
| mammal | 3 | whale | 
| bird | 1 | penguin | 
| bird | 2 | ostrich | 
+--------+----+---------+ 
  • 在這種情況下(當AUTO_INCREMENT列是多列索引的一部分),如果刪除 行以任何組的最大AUTO_INCREMENT值AUTO_INCREMENT值重複使用。即使對於MyISAM表,這個 也會發生,通常AUTO_INCREMENT值 不會被重用。

  • 如果AUTO_INCREMENT列是多個索引的一部分,MySQL將使用以 AUTO_INCREMENT列開頭的索引(如果有的話)生成序列值。例如,如果動物 表包含索引PRIMARY KEY(grp,id)和INDEX(id),則MySQL 將忽略用於生成序列值的PRIMARY KEY。作爲 的結果,該表格將包含單個序列,而不是每 grp值的序列。