如何在 MySQL 中的 INSERT 语句中使用 SELECT MAX?

How to use SELECT MAX inside an INSERT statement in MySQL?

简短版本: 如何获取列的最大值并在使用 INSERT INTO 语句添加行时使用结果?

长版: 我已阅读问题:How to use 'select ' in MySQL 'insert' statement 并尝试按照说明获取答案。这是我的查询:

INSERT INTO employee (id, name, state, supervisorId) SELECT MAX(id)+1, 'Dan', state, supervisorId FROM employee WHERE name='Chris';

但是我得到这个错误:

ERROR: 1062: Duplicate entry '7' for key 'PRIMARY'

原因是我有另一行的 id 是 7。因此,

MAX(id)

不是 return 实际最大值,而是等于包含 'Chris' 的行的 id 的值,即 6。

我做错了什么?

你可以通过替换这个来修复它:

MAX(id)+1

使用此 select 查询:

(SELECT MAX(id)+1 FROM employee)

完整的查询如下:

INSERT INTO employee (id, name, state, supervisorId) SELECT (SELECT MAX(id)+1 FROM employee), 'Dan', state, supervisorId FROM employee WHERE name='Chris';

更新:

虽然这个答案解决了有关在 INSERT 查询中获取 SELECT MAX 的一般问题,但正如@RaymondNijland 所建议的那样,最好充分利用 MySQL auto_increment 功能。为此:

1) 创建主键列,自动递增:

 ALTER TABLE employee MODIFY COLUMN id INT NOT NULL AUTO_INCREMENT;

2) 从您的插入查询中删除 ID:

INSERT INTO employee (name, state, supervisorId) SELECT 'Dan', state, supervisorId FROM employee WHERE name='Chris';

对 SQL 查询使用手动增量可能会导致竞争条件。 创建 table PK(主键)时,您应该具有 AI(自动增量)约束。

    CREATE TABLE table_name
    (
    table_id int NOT NULL PRIMARY KEY AUTO INCREMENT,
    ....
    );

如果您绝对必须使用手动增量,请使用 SELECT 语句。