如何在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 语句以使用数组中的多行填充表
INSERT..ON DUPLICATE KEY UPDATE 语句中的锁定如何工作?
无法在准备好的 INSERT 语句中的 python mysql.connector 中使用 None (NULL) 值