首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SQL中,可以在INSERT语句的VALUES子句中嵌套SELECT语句吗?

问在SQL中,可以在INSERT语句的VALUES子句中嵌套SELECT语句吗?
EN

Stack Overflow用户
提问于 2018-08-16 04:18:16
回答 4查看 311关注 0票数 0

在SQL中,是否可以在INSERT语句的VALUES子句中嵌套SELECT语句?我正在使用MySQL,并希望在创建新记录时查询表中字段的最大值加1,如下所示。

代码语言:javascript
复制
INSERT into attornies (
  LawOfficeId, LawOfficeName
) VALUES (
  (select max(LawOfficeID)+1 from attornies), 
  'Wee, Sue Em and Howe'
);

我不确定我的语法是不是很糟糕,我试图做的事情是不可能的,等等。当然,如果我试着把它作为两个单独的语句,它可以工作,但我想让它成为一个语句。我知道一个建议是使用自动递增,但我不想这样做。

如果这个问题已经回答了,请给我指出那个方向。如果不是....帮助。

EN

回答 4

Stack Overflow用户

发布于 2018-08-16 04:22:23

是的,你能做到

代码语言:javascript
复制
INSERT into attornies (
  LawOfficeId, LawOfficeName
)
select max(LawOfficeID) + 1,'Wee, Sue Em and Howe' from attornies;

但是,与自动增量相比,不建议这样做,因为如果多个线程正在执行插入操作,则可能会遇到重复主键的情况

票数 6
EN

Stack Overflow用户

发布于 2018-08-16 04:24:20

您的查询应该可以工作。insert的values子句中允许使用标量子查询。

一般来说,它通常会写成:

代码语言:javascript
复制
insert into attornies (LawOfficeId, LawOfficeName) 
   select max(LawOfficeID)+1,  'Wee, Sue Em and Howe'
   from attornies;

然而,这并不是做你想做的事情的正确方式。相反,创建一个具有自动增量列的attornies --我将其重命名为lawOffices,因为这似乎是我的目的:

代码语言:javascript
复制
create table lawOffices (
    lawOfficeId int auto_increment primary key,
    lawOfficeName varchar(255)
);

然后执行以下操作:

代码语言:javascript
复制
insert into lawOffices (lawOfficeName)
    values ( 'Wee, Sue Em and Howe' );

数据库执行递增id的工作。

票数 2
EN

Stack Overflow用户

发布于 2018-08-16 04:44:21

您不能使用您所显示的语法。

代码语言:javascript
复制
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 clause

https://dev.mysql.com/doc/refman/8.0/en/subquery-errors.html说:

您可以在UPDATE语句中使用子查询进行赋值,因为子查询在UPDATE和DELETE语句以及SELECT语句中都是合法的。但是,不能对子查询FROM子句和更新目标使用同一个表(在本例中为表t1)。

文档讨论的是在UPDATE语句中使用子查询,但同样的规则也适用于INSERT或DELETE语句。

但是,这是可行的:

代码语言:javascript
复制
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: 0

https://dev.mysql.com/doc/refman/8.0/en/insert-select.html说:

INSERT语句的目标表可能出现在查询的SELECT部分的FROM子句中。但是,不能在子查询中插入到表中并从同一个表中进行选择。

在同一个表中进行选择和插入时,MySQL会创建一个内部临时表来保存SELECT中的行,然后将这些行插入到目标表中。

我同意其他的回答和评论,他们警告您不要使用MAX()+1方法来获取下一个id值。此方法易受竞争条件的影响。请改用自动增量列。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51865835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档