我有一个包含许多用户的表。在该表中,我有一个名为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 | +--------------+-----------------------+
以下查询将执行此操作,但是仅在表中已经存在“鲍勃”的情况下才有效…
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开始。
您可以使用如下所示的内容:
INSERT INTO users (user_id, name) SELECT 1 + coalesce((SELECT max(user_id) FROM users WHERE name='Bob'), 0), 'Bob';
但是这样的查询会导致竞争状况。在运行之前,请确保您正在事务中并锁定了用户表。否则,您可能会得到两个具有相同编号的鲍勃。