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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在MySQL中的INSERT语句中使用SELECT MAX?相关的知识,希望对你有一定的参考价值。

简短版本:如何在使用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)

不返回实际的最大值,而是返回一个值,该值等于包含'Chris'的行的id,即6。

我究竟做错了什么?

答案

您可以通过替换它来修复它:

MAX(id)+1

使用此选择查询:

(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查询上使用手动增量可能会导致竞争条件。创建表PK(主键)时,应该有AI(自动增量)约束。

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

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

以上是关于如何在MySQL中的INSERT语句中使用SELECT MAX?的主要内容,如果未能解决你的问题,请参考以下文章

php - 如何生成 MySQL INSERT 语句以使用数组中的多行填充表

MySQL实战中的Insert语句的使用心得

INSERT..ON DUPLICATE KEY UPDATE 语句中的锁定如何工作?

无法在准备好的 INSERT 语句中的 python mysql.connector 中使用 None (NULL) 值

如何使用mysql语句向表中插入数据

怎样将mysql中表格数据装换成insert 语句?