使用 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的区别