这是表的格式:
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"应根据" group"
自动递增答案 0 :(得分:2)
试试这个:
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
<强> 编辑: 强>
如果要插入新行,则必须这样做:
insert into yourtable
select '$indexer', '$group', '$name', coalesce(max(id), 0) + 1
from yourtable
where name = '$name'
答案 1 :(得分:2)
如果要使用内置函数,则必须使用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值的行。这个 甚至对于具有AUTO_INCREMENT值的MyISAM表也会发生 通常不会被重复使用。
如果AUTO_INCREMENT列是多个索引的一部分,MySQL会使用以 AUTO_INCREMENT列,如果有的话。例如,如果动物 表包含索引PRIMARY KEY(grp,id)和INDEX(id),MySQL 会忽略PRIMARY KEY来生成序列值。作为一个 结果,该表将包含单个序列,而不是每个序列 grp值。