在父表上截断会导致删除子表记录,外键的零值



为什么在父表上使用cascade子句截断时,为什么在子表中删除所有行>据我所知,设置外键的空值不应将给定行中的数据链接到父表。

在Oracle 12c和18(Live SQL(中对此进行了测试的陈述如下:

CREATE TABLE ports 
  ( 
     port_id   NUMBER, 
     port_name VARCHAR2(20) CONSTRAINT port_description_nn NOT NULL ENABLE, 
     country   VARCHAR2(40), 
     capacity  NUMBER, 
     CONSTRAINT port_pk PRIMARY KEY (port_id) 
  ); 
CREATE TABLE ships 
  ( 
     ship_id      NUMBER PRIMARY KEY, 
     ship_name    VARCHAR2(20), 
     home_port_id NUMBER, 
     CONSTRAINT ships_ports_fk FOREIGN KEY (home_port_id) REFERENCES ports ( 
     port_id) ON DELETE CASCADE 
  ); 
INSERT INTO ports 
VALUES      (315, 
             'ATLANTA', 
             'USA', 
             100000); 
INSERT INTO ships 
VALUES      (4000, 
             'CODD LAND ROVER', 
             315); 
INSERT INTO ships 
VALUES      (4001, 
             'CODD VESSEL TWO', 
             NULL); 

之后,以下语句

TRUNCATE TABLE PORTS CASCADE;

即使" CODD船只二"的home_port_id null值为无效,

删除了船舶表中的所有行,这是外键。

这是由于创建外键时的删除级联条款,这是一个预期的结果吗?

这是预期的结果吗?

是。截断命令的文档说:

cascade

如果指定级联 表该参考表在删除级联上启用了 参考约束。这是一个递归操作 截断所有儿童桌子,赠款表等 指定的选项。

相关内容

  • 没有找到相关文章

最新更新