DB2 INSERT INTO SELECT状态将行复制到同一张表中,不允许多行。

问题描述 投票:-1回答:1

我已经找了几天这个问题的答案,但找不到任何参考这个具体问题的资料。

首先,如果我想使用INSERT INTO SELECT语句将表的行复制过来,回到同一个表中,但用新的id和其中的1个列修改,应该能行吗?

举个例子。

INSERT INTO TABLE_A (column1, column2, column3) SELECT column1, 'value to change', column3 from TABLE_A where column 2 = 'original value';

当我在DB2数据库中尝试这样做时,我得到了以下错误:

INVALID MULTIPLE-ROW INSERT. SQLCODE=-533,SQLSTATE=21501,DRIVER=4.18.60。

如果我运行同样的语句,但我在select语句中放入一个特定的ID来返回,确保只返回1条记录,那么语句就会工作。 但这违背了我想做的事情,即把同一表中的多条记录复制到自己的表中,同时把一个特定的列更新为一个新的值。

谢谢大家!我一直在寻找答案。

db2 sql-insert self-join
1个回答
0
投票

我在Db2 11.1.4.0上工作得很好,没有错误。

CREATE TABLE TABLE_A( column1 int , column2 varchar(16), column3 int)

INSERT INTO TABLE_A values (1,'original value',3)

INSERT INTO TABLE_A (column1, column2, column3)
SELECT column1, 'value to change', column3 from TABLE_A where column2 = 'original value'

SELECT * FROM TABLE_A

返回

COLUMN1|COLUMN2        |COLUMN3
-------|---------------|-------
      1|original value |      3
      1|value to change|      3

也许有什么东西你没有告诉我们......


0
投票

你没有提到你的平台和版本,但文档似乎很清楚。

IBM LUW 11.5

对自引用表进行多行INSERT是无效的。

第一个谷歌结果

一个带有子选择的INSERT操作试图将多条记录插入到一个自引用表中。INSERT操作的子选区返回的数据不应超过一行。系统操作。INSERT语句无法执行。对象表的内容没有变化。程序员的响应。检查子选择的搜索条件,确保选择的数据不超过一行。

EDIT 显然你在表上有一个自引用约束。 例如:EMPLOYEES表的MANAGER列定义为FK自引用回EMPLOYEES表。

Db2根本不支持你要做的事情。

你需要一个临时表来保存修改后的行。

可以选择,假设你的表有一个主键,尝试使用 MERGE 语句代替。

© www.soinside.com 2019 - 2024. All rights reserved.