如何在mysql的insert语句中使用selectmax?

dpiehjr4  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(868)

short version:在insert into语句中添加行时,如何获得列的最大值并使用结果?
长版:我读过一个问题:如何在mysql'insert'语句中使用'select',并试着按照说明寻找答案。我的问题是:

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

但我有个错误:

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

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

  1. MAX(id)

不返回实际的最大值,但返回一个值,该值等于包含“chris”的行的id,即6。
我做错什么了?

dsekswqp

dsekswqp1#

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

  1. MAX(id)+1

使用此选择查询:

  1. (SELECT MAX(id)+1 FROM employee)

以下是完整的查询:

  1. 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的自动增量功能。为此:
1) 使主键列自动递增:

  1. ALTER TABLE employee MODIFY COLUMN id INT NOT NULL AUTO_INCREMENT;

2) 从插入查询中删除id:

  1. INSERT INTO employee (name, state, supervisorId) SELECT 'Dan', state, supervisorId FROM employee WHERE name='Chris';
展开查看全部
hjzp0vay

hjzp0vay2#

对sql查询使用手动增量可能导致竞争条件。在创建表pk(主键)时,应该有ai(自动递增)约束。

  1. CREATE TABLE table_name
  2. (
  3. table_id int NOT NULL PRIMARY KEY AUTO INCREMENT,
  4. ....
  5. );

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

相关问题