MySql INSERT MAX()+ 1的问题

Cha*_*had 12 mysql sql insert increment max

我有一个包含许多用户的表.在该表中,我有一个名为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                   |
+--------------+-----------------------+
Run Code Online (Sandbox Code Playgroud)

以下查询将执行此操作,但只有在表中已存在"Bob"时才会起作用...

INSERT INTO users(user_id, name) SELECT(SELECT MAX(user_id)+1 from users where 
name='Bob'), 'Bob';
Run Code Online (Sandbox Code Playgroud)

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

Luk*_*ský 17

你可以使用这样的东西:

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

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

  • 是的,查询有效,但请不要忽略第二部分.:)或者如果你决定忽略它,至少在`(name,user_id)`上创建一个唯一索引,这样否则会产生重复的查询失败. (2认同)

Gre*_*reg 6

您可以使用IFNULL:

INSERT INTO users(user_id, name)
SELECT(IFNULL((SELECT MAX(user_id)+1 from users where name='Bob'), 1), 'Bob';
Run Code Online (Sandbox Code Playgroud)