在SQL中,是否可以在INSERT语句的VALUES子句中嵌套SELECT语句?我正在使用MySQL,并希望在创建新记录时查询表中字段的最大值加1,如下所示。
INSERT into attornies (
LawOfficeId, LawOfficeName
) VALUES (
(select max(LawOfficeID)+1 from attornies),
'Wee, Sue Em and Howe'
);我不确定我的语法是不是很糟糕,我试图做的事情是不可能的,等等。当然,如果我试着把它作为两个单独的语句,它可以工作,但我想让它成为一个语句。我知道一个建议是使用自动递增,但我不想这样做。
如果这个问题已经回答了,请给我指出那个方向。如果不是....帮助。
发布于 2018-08-16 04:22:23
是的,你能做到
INSERT into attornies (
LawOfficeId, LawOfficeName
)
select max(LawOfficeID) + 1,'Wee, Sue Em and Howe' from attornies;但是,与自动增量相比,不建议这样做,因为如果多个线程正在执行插入操作,则可能会遇到重复主键的情况
发布于 2018-08-16 04:24:20
您的查询应该可以工作。insert的values子句中允许使用标量子查询。
一般来说,它通常会写成:
insert into attornies (LawOfficeId, LawOfficeName)
select max(LawOfficeID)+1, 'Wee, Sue Em and Howe'
from attornies;然而,这并不是做你想做的事情的正确方式。相反,创建一个具有自动增量列的attornies --我将其重命名为lawOffices,因为这似乎是我的目的:
create table lawOffices (
lawOfficeId int auto_increment primary key,
lawOfficeName varchar(255)
);然后执行以下操作:
insert into lawOffices (lawOfficeName)
values ( 'Wee, Sue Em and Howe' );数据库执行递增id的工作。
发布于 2018-08-16 04:44:21
您不能使用您所显示的语法。
mysql> INSERT into attornies (
-> LawOfficeId, LawOfficeName
-> ) VALUES (
-> (select max(LawOfficeID)+1 from attornies),
-> 'Wee, Sue Em and Howe'
-> );
ERROR 1093 (HY000): You can't specify target table 'attornies' for update in FROM clausehttps://dev.mysql.com/doc/refman/8.0/en/subquery-errors.html说:
您可以在UPDATE语句中使用子查询进行赋值,因为子查询在UPDATE和DELETE语句以及SELECT语句中都是合法的。但是,不能对子查询FROM子句和更新目标使用同一个表(在本例中为表t1)。
文档讨论的是在UPDATE语句中使用子查询,但同样的规则也适用于INSERT或DELETE语句。
但是,这是可行的:
mysql> INSERT into attornies (
-> LawOfficeId, LawOfficeName
-> )
-> select max(LawOfficeID) + 1,'Wee, Sue Em and Howe' from attornies;
Query OK, 1 row affected (0.02 sec)
Records: 1 Duplicates: 0 Warnings: 0https://dev.mysql.com/doc/refman/8.0/en/insert-select.html说:
INSERT语句的目标表可能出现在查询的SELECT部分的FROM子句中。但是,不能在子查询中插入到表中并从同一个表中进行选择。
在同一个表中进行选择和插入时,MySQL会创建一个内部临时表来保存SELECT中的行,然后将这些行插入到目标表中。
我同意其他的回答和评论,他们警告您不要使用MAX()+1方法来获取下一个id值。此方法易受竞争条件的影响。请改用自动增量列。
https://stackoverflow.com/questions/51865835
复制相似问题