如何根据mysql

时间:2016-08-03 07:49:13

标签: mysql auto-increment

这是表的格式:

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"

自动递增

2 个答案:

答案 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

Demo Here

<强> 编辑:

如果要插入新行,则必须这样做:

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值。

  •