对父子表使用多表插入

Isa*_*man 9 oracle foreign-key

使用 Oracle 的多表插入语句插入(外键约束)父子表是否安全?

通过最少的示例,我发现只要父表在into列表中的子表之前,它就可以工作。我可以依靠这个还是应该使约束可以延迟?

Lei*_*fel 8

,你不能依赖这个。SQL 是声明性的,而不是过程性的,因此在语句中您不能保证执行顺序。由于整个INSERT ALL语句被视为单个语句 ( doc ),因此您不能保证一个语句INSERT会在另一个语句之前。

根据定义,INSERT FIRST必须执行第一个INTO传递评估条件。我们可能期望INSERT ALL行为相似。这似乎是这样:

DROP TABLE T1;
CREATE TABLE T1 AS (SELECT 'a' c1, 0 c2, 0 c3 FROM dual WHERE 1=2);
INSERT ALL 
   WHEN mod(x,2)<>0 THEN INTO T1 VALUES ('a', x, mod(x,2)) 
   WHEN mod(x,2)=0 THEN INTO T1 VALUES ('b', x, mod(x,2)) 
   SELECT Level x FROM dual CONNECT BY Level <=20;
COMMIT;   
SELECT rowid, c1, c2, c3 FROM t1;
Run Code Online (Sandbox Code Playgroud)

但是,即使我们可以在特定平台/版本/补丁集上演示特定行为,仍然不能保证这一点。

Oracle-developer.net明确表示:

INSERT FIRST 语句中的条件将按从上到下的顺序进行评估。Oracle 对 INSERT ALL 语句不做此类保证。


小智 2

艾萨克,

您不能依赖这一点,因为 oracle 不保证 INSERT 的顺序。正如您所提到的,执行此操作的正确方法是使用延迟外键约束。