MySql INSERT MAX()+ 1的问题

时间:2009-10-19 08:38:40

标签: sql mysql insert max increment

我有一个包含许多用户的表。在该表中,我有一个名为user_id(INT)的列,我想为每个人单独增加。 user_id必须从1开始

我准备了一个简单的例子:

Showing all names
+--------------+-----------------------+
| user_id      | name                  |
+--------------+-----------------------+
| 1            | Bob                   |
| 1            | Marry                 |
| 2            | Bob                   |
| 1            | John                  |
| 3            | Bob                   |
| 2            | Marry                 |
+--------------+-----------------------+


Showing only where name = Bob
+--------------+-----------------------+
| user_id      | name                  |
+--------------+-----------------------+
| 1            | Bob                   |
| 2            | Bob                   |
| 3            | Bob                   |
+--------------+-----------------------+

以下查询将执行此操作,但只有在表中已存在“Bob”时才会生效...

INSERT INTO users(user_id, name) SELECT(SELECT MAX(user_id)+1 from users where 
name='Bob'), 'Bob';

如果Bob不存在(第一个条目),则user_id设置为0(零)。这就是问题。我需要user_id从1开始而不是0。

4 个答案:

答案 0 :(得分:16)

您可以使用以下内容:

INSERT INTO users (user_id, name)
SELECT 1 + coalesce((SELECT max(user_id) FROM users WHERE name='Bob'), 0), 'Bob';

但是这样的查询可能导致竞争条件。确保您处于事务中并在运行之前锁定users表。否则你可能会得到两个具有相同数字的Bobs。

答案 1 :(得分:6)

您可以使用IFNULL

INSERT INTO users(user_id, name)
SELECT(IFNULL((SELECT MAX(user_id)+1 from users where name='Bob'), 1), 'Bob';

答案 2 :(得分:3)

一直是reported as a bug in MySQL

我引用了Guilhem Bichot:

  

其次,这是最简单的解决方法:
  而不是使用:
  插入foo(lfd)值((从foo中选择max(lfd))+1)
  只是做   从foo插入foo(lfd)select(max(lfd)+1);

答案 3 :(得分:1)

然后不要使用MAX()+ 1。在表格上使用自动编号方案。

我没有正确地阅读这个问题。使用Greg建议的IFNULL()。