0

我正在尝试使用以下形式的全部插入来查询将多行插入表中:

insert all
into application (col1, col2, etc)
values (val1, val2, etc)
select * from application;

如果没有插入,所有这些都可以工作,但是当我这样做时,会出现ORA-00001: unique constraint violated. 它给我的约束错误代码是主键,但我试图插入的值不是主键的重复项。任何帮助将不胜感激。

4

1 回答 1

3

如果您要插入固定值val1,val2等,它们将为表中已经存在的每一行插入一次(因为intoand fromboth 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语法没有多大意义,即使这样,单个语句也可能更清晰。intoinsert

于 2013-07-10T10:16:10.000 回答