插入所有失败归咎于重复不是

时间:2013-07-10 09:44:38

标签: sql oracle duplicates sql-insert

我正在尝试使用表单中的所有插入来查询将多行插入表中:

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

删除插件所有这些都有效,但是当我使用ORA-00001: unique constraint violated时出错。它给我的约束错误代码是主键,但我试图插入的值不是主键的重复。任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:3)

如果您要插入固定值val1val2等,则会为表格中已存在的每一行插入一次(因为into和{{ 1}}都引用from)。您没有插入与现有主键冲突的值,而是多次插入相同的 new 主键,这会产生相同的错误。

如果该表为空,则不会插入任何行;如果它有一行你会插入一行(如果你没有手动复制密钥,可能是正确的);否则你会自动创建重复项。如果没有导致异常的主键,每次运行时都会使表中的行数加倍。

您可以在带有主键的虚拟表上进行尝试,以查看实际插入的内容:

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 子句为事先在tablle中存在的每一行创建了一个新行。显然,如果into上有PK,那么您已经插入了新值的重复项。

我认为你想要引用同一个表的唯一一次是你要根据其他行创建行,例如(高度做作):

col1

如果你想输入固定值,你可以选择双重代替,这将为每组提供的值提供一行:

insert all
into application (col1, col2, ...)
values (col1 + 100, col2 || ' adjusted', ...)
select col1, col2 from application;

从上面重复demp:

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

当然除非您有多个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语句也可能更清晰。