Sql 对父表进行截断会导致删除外键值为空的子表记录
为什么在父表上使用TRUNCATE with CASCADE子句时会删除子表中的所有行,即使子表中的某些记录的外键值为NULL 据我所知,为外键设置NULL值不应将给定行中的数据链接到父表 在Oracle 12c和18(Live SQL)中测试此功能的语句如下:Sql 对父表进行截断会导致删除外键值为空的子表记录,sql,oracle,oracle-sqldeveloper,truncate,Sql,Oracle,Oracle Sqldeveloper,Truncate,为什么在父表上使用TRUNCATE with CASCADE子句时会删除子表中的所有行,即使子表中的某些记录的外键值为NULL 据我所知,为外键设置NULL值不应将给定行中的数据链接到父表 在Oracle 12c和18(Live SQL)中测试此功能的语句如下: CREATE TABLE ports ( port_id NUMBER, port_name VARCHAR2(20) CONSTRAINT port_description_nn NOT NULL E
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;
删除SHIPS表中的所有行,即使“Codd Vesser Two”的HOME_PORT_ID为空值,这是一个外键
由于创建外键时的ON DELETE CASCADE子句,这是预期的结果吗
这是预期的结果吗
对。指挥部的文件说明:
级联
如果指定CASCADE,则Oracle数据库将截断所有子项
表具有启用的ON DELETE级联的引用表
引用约束。这是一个递归操作,将
使用
指定的选项
文档上怎么说?
TRUNCATE
与DELETE
不同……我想Mat是想告诉你。使用truncate cascade
上的特定引号:“请注意,所有行都已从从属表中删除,即使是那些与其父表中的行不相关的行。值得注意的是,DELETE cascade和truncate cascade命令之间的这一区别。”