12

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

4 回答 4

17

你可以使用这样的东西:

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

但是这样的查询可能会导致竞争条件。确保您处于事务中并在运行用户表之前锁定它。否则,您最终可能会得到两个具有相同编号的 Bob。

于 2009-10-19T08:47:32.113 回答
6

您可以使用IFNULL

INSERT INTO users(user_id, name)
SELECT(IFNULL((SELECT MAX(user_id)+1 from users where name='Bob'), 1), 'Bob';
于 2009-10-19T08:43:37.250 回答
3

它已被报告为 MySQL 中的错误

我引用Guilhem Bichot的话:

其次,这是最简单的解决方法:
而不是使用:
insert into foo(lfd) values((select max(lfd) from foo)+1)
只需
insert into foo(lfd) select (max(lfd)+1)来自 foo;

于 2010-01-02T14:52:03.160 回答
1

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

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

于 2009-10-19T08:40:40.177 回答