我有一个包含许多用户的表。在该表中,我有一个名为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。
答案 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()。