我正在尝试使用表单中的所有插入来查询将多行插入表中:
insert all
into application (col1, col2, etc)
values (val1, val2, etc)
select * from application;
删除插件所有这些都有效,但是当我使用ORA-00001: unique constraint violated
时出错。它给我的约束错误代码是主键,但我试图插入的值不是主键的重复。任何帮助都会非常感激。
答案 0 :(得分:3)
如果您要插入固定值val1
,val2
等,则会为表格中已存在的每一行插入一次(因为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
语句也可能更清晰。