使用 insert into ... select 会导致 select 附近的语法不正确,为啥?

Posted

技术标签:

【中文标题】使用 insert into ... select 会导致 select 附近的语法不正确,为啥?【英文标题】:Using insert into ... select results in a incorrect syntax near select, why?使用 insert into ... select 会导致 select 附近的语法不正确,为什么? 【发布时间】:2011-06-06 16:12:46 【问题描述】:

如何在 INSERT 操作中进行 SELECT?

insert into tableX (a_id, b_id) 
VALUES ((SELECT service_id 
         FROM tableY 
         WHERE id = 10, 2));

但是服务器返回语法错误,为什么?

SQL Error [156] [S0001]: Incorrect syntax near the keyword 'select'.

【问题讨论】:

【参考方案1】:

虽然我最初的答案给出了一个可行的解决方案,但实际上我对错误原因的理解是错误的。在 VALUES 子句中使用标量子查询没有任何问题。问题中陈述的问题只是一个括号放错了位置。标量子查询必须用括号括起来。

这应该可行:

insert into tableX (a_id, b_id) 
VALUES (
  (SELECT service_id 
         FROM tableY 
         WHERE id = 10)
  , 2
  );

原答案

VALUES 只能与文字值一起使用。但是,字面量值可以在子查询中使用。这样做:

insert into tableX (a_id, b_id) SELECT service_id, 2 FROM tableY WHERE id = 10

【讨论】:

【参考方案2】:

您不需要 values 关键字,也可以在选择列表中为 b_id 列添加默认值 2,而不是在 SELECT 语句之后添加它

试试这个:

INSERT INTO tableX (a_id, b_id) 
SELECT service_id, 2 
  FROM tableY 
 WHERE id = 10

【讨论】:

【参考方案3】:

您不需要values 字。

这里有一些mysql的文档

http://dev.mysql.com/doc/refman/5.0/en/insert-select.html

此外,当您指定应插入值的列时,您需要确保您的选择返回与您指定的内容相同的数字/类型。

【讨论】:

【参考方案4】:

您告诉 DBMS 您正在插入两个值(a_id、b_id)但只选择一个(service_id)。

【讨论】:

不完全——尽管他的括号放错了位置,但我认为,2 应该是第二个值。【参考方案5】:

试试:

insert into tableX (a_id, b_id)
SELECT service_id, 4 as QUESTIONMARK FROM tableY WHERE id in (10, 2);

这适用于许多数据库引擎,但我们不知道您正在使用什么环境。

编辑:第二个插入应该是什么?

【讨论】:

【参考方案6】:

MySQL 中可以插入动态值。这是示例:

INSERT INTO Item_Info (`Back_Ground_Color`,) 
VALUES ( (select concat('#',SUBSTRING((lpad(hex(round(rand() * 10000000)),6,0)),-6))));

【讨论】:

这不能回答问题

以上是关于使用 insert into ... select 会导致 select 附近的语法不正确,为啥?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle中insert into select和select into的区别

SELECT INTO 和 INSERT INTO SELECT比较

select into from 和 insert into select的使用

Oracle中insert into select和select into的区别

insert into linksvr select VS insert into from linksvr

INSERT INTO vs SELECT INTO