我正在尝试使用以下形式的全部插入来查询将多行插入表中:
insert all
into application (col1, col2, etc)
values (val1, val2, etc)
select * from application;
如果没有插入,所有这些都可以工作,但是当我这样做时,会出现ORA-00001: unique constraint violated
. 它给我的约束错误代码是主键,但我试图插入的值不是主键的重复项。任何帮助将不胜感激。
我正在尝试使用以下形式的全部插入来查询将多行插入表中:
insert all
into application (col1, col2, etc)
values (val1, val2, etc)
select * from application;
如果没有插入,所有这些都可以工作,但是当我这样做时,会出现ORA-00001: unique constraint violated
. 它给我的约束错误代码是主键,但我试图插入的值不是主键的重复项。任何帮助将不胜感激。
如果您要插入固定值val1
,val2
等,它们将为表中已经存在的每一行插入一次(因为into
and from
both reference application
)。您没有插入与现有主键冲突的值,而是多次插入相同的新主键,这会产生相同的错误。
如果该表为空,则不会插入任何行;如果它有一行,您将插入一行(如果您没有手动复制密钥,可能是正确的);否则你会自动创建重复项。如果没有导致异常的主键,每次运行时,表中的行数都会增加一倍。
您可以在带有主键的虚拟表上尝试它,以查看实际插入的内容:
create table t42(col1 number, col2 varchar2(10));
insert into t42 values (1, 'A');
insert into t42 values (2, 'B');
insert into t42 values (3, 'C');
insert all
into t42 (col1, col2) values (4, 'D')
into t42 (col1, col2) values (5, 'E')
select * from t42;
6 rows inserted.
select * from t42;
COL1 COL2
---------- ----------
1 A
2 B
3 C
4 D
4 D
4 D
5 E
5 E
5 E
9 rows selected
...因此您可以看到每个into
子句为预先存在于表格中的每一行创建了一个新行。显然,如果有 PK,col1
那么您将插入新值的副本。
我唯一能想到你想要引用同一张表的情况是,如果你正在创建基于其他行的行,例如(高度做作):
insert all
into application (col1, col2, ...)
values (col1 + 100, col2 || ' adjusted', ...)
select col1, col2 from application;
如果要输入固定值,则可以从 dual 中进行选择,这将为每个提供的值集提供一行:
insert all
into application (col1, col2, ...)
values (val1, val2, ...)
select * from dual;
从上面重复 demp:
create table t42(col1 number, col2 varchar2(10));
insert into t42 values (1, 'A');
insert into t42 values (2, 'B');
insert into t42 values (3, 'C');
insert all
into t42 (col1, col2) values (4, 'D')
into t42 (col1, col2) values (5, 'E')
select * from dual;
2 rows inserted.
select * from t42;
COL1 COL2
---------- ----------
1 A
2 B
3 C
4 D
5 E
5 rows selected
当然,除非您有多个子句,否则使用此insert all
语法没有多大意义,即使这样,单个语句也可能更清晰。into
insert