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

为什么在父表上使用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 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命令之间的这一区别。”