为什么在父表上使用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
如果指定级联 表该参考表在删除级联上启用了 参考约束。这是一个递归操作 截断所有儿童桌子,赠款表等 指定的选项。