【发布时间】:2019-02-14 07:54:30
【问题描述】:
短版: 使用 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。
我做错了什么?
【问题讨论】:
-
“我做错了什么?”不要这样做,你的想法看起来很容易出现 竞争条件。如果两个插入同时发生,两个 id 可以是相同的。除了你在重新发明轮子 MySQL 有
AUTO_INCREMENT为此(dev.mysql.com/doc/refman/8.0/en/example-auto-increment.html) -
@RaymondNijland 我对mySQL了解不多,但我认为应该存在排他锁机制,不是吗?
-
"我对 mySQL 了解不多,但我认为应该存在排他锁机制,不是吗" 是的,但是为什么要锁定会降低 InnoDB 引擎上的线程并发性的表? @BarbarosÖzhan 我在这里假设 InnoDB,因为 InnoDB 是 MySQL 中的默认表引擎几年了。
-
感谢@RaymondNijland,但我尝试运行此命令“INSERT INTO employee (name, state, supervisorId) SELECT 'Dan', state, supervisorId FROM employee WHERE name='Chris';”但它给了我这个错误:“错误:1364:字段'id'没有默认值”
-
运行
ALTER TABLE employee MODIFY COLUMN id INT AUTO_INCREMENT然后您的 INSERT 应该可以正常工作。
标签: mysql sql select max insert-into