【问题标题】:INSERT ALL statement in Oracle failing to insertOracle 中的 INSERT ALL 语句插入失败
【发布时间】:2015-05-07 14:39:25
【问题描述】:

我有多行要插入到一个表中。 表中有一些约束在少数行中失败。 但是使用 INSERT ALL 语句,当它发现第一个带有约束的插入失败时,它会停止插入到 oracle db 并且其余正确的数据也不会插入。 它只会以这种方式工作吗?或者我们有什么方法可以插入所有有效数据并忽略 INSERT ALL 中的其他插入。

【问题讨论】:

  • 你可以发布查询吗?
  • 正如@mmhasannn 已经提到的 - 请为您尝试插入的所有表以及您的 INSERT 语句发布 DDL 语句。

标签: oracle


【解决方案1】:

当它发现第一个带有约束的插入失败时,它会停止插入到 oracle db,并且其他正确的数据也不会插入。它只会以这种方式工作吗?

是的,它被设计为以这种方式工作。 INSERT ALL 语句将无法插入如果任何一行出错

例如,

SQL> CREATE TABLE t(a NUMBER);

Table created.

SQL> ALTER TABLE t ADD CONSTRAINT t_unique UNIQUE(a);

Table altered.

SQL> INSERT INTO t(a) VALUES(1);

1 row created.

SQL> INSERT ALL
  2    INTO t (a) VALUES (1)
  3    INTO t (a) VALUES (2)
  4    INTO t (a) VALUES (3)
  5  SELECT * FROM dual;
INSERT ALL
*
ERROR at line 1:
ORA-00001: unique constraint (LALIT.T_UNIQUE) violated    

SQL> SELECT * FROM t;

         A
----------
         1

如果您想插入其他正确的值,则将它们作为单独的插入语句并将所有插入语句作为脚本执行。

例如,

SQL> CREATE TABLE t(a NUMBER);

Table created.

SQL> ALTER TABLE t ADD CONSTRAINT t_unique UNIQUE(a);

Table altered.

SQL> INSERT INTO t(A) VALUES(1);

1 row created.

SQL> INSERT INTO t(a) VALUES(1);
INSERT INTO t(a) VALUES(1)
*
ERROR at line 1:
ORA-00001: unique constraint (LALIT.T_UNIQUE) violated    

SQL> INSERT INTO t(A) VALUES(2);

1 row created.

SQL> INSERT INTO t(A) VALUES(3);

1 row created.

SQL> SELECT * FROM t;

         A
----------
         1
         2
         3

【讨论】:

  • 谢谢,我目前正在通过脚本插入单个插入语句。但想尝试 INSERT ALL,但由于某些行存在违规而失败。
  • 您可以在 PL/SQL 中实现异常处理,但是,在 SQL 中,INSERT ALL 语句是一个单独的事务。要么插入所有行,要么不插入。这是原子性的基本规则。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-01
  • 1970-01-01
  • 2017-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多