当列包含 NULL 时,ON DELETE CASCADE 不起作用

问题描述 投票:0回答:1

ON DELETE CASCADE 在下面的代码中不起作用。

我期望得到一个空响应,但插入的记录仍然存在。

(无法在 Parent 中创建主键,因为 Column2 允许 NULL。)

有没有简单的方法可以解决这个问题?

CREATE TABLE Parent (
  Column1 INT NOT NULL,
  Column2 INT NULL
)

CREATE TABLE Child (
  Column1 INT NOT NULL,
  Column2 INT NULL,
  AdditionalInfo INT NOT NULL
)

ALTER TABLE Parent ADD CONSTRAINT UQ UNIQUE CLUSTERED (Column1, Column2) 

ALTER TABLE Child
ADD CONSTRAINT [FK_Parent_Child] FOREIGN KEY(Column1, Column2) 
REFERENCES Parent(Column1, Column2)
ON DELETE CASCADE

INSERT INTO Parent (Column1, Column2) VALUES(1, NULL)
INSERT INTO Child (Column1, Column2, AdditionalInfo) VALUES(1, NULL, 1)

DELETE FROM Parent WHERE Column1=1 AND Column2 IS NULL

SELECT * FROM Child
sql-server t-sql
1个回答
0
投票

您遇到了第 2 列空值的问题。如果您想正常工作 DELETE CASCADE,您必须为相互引用的列设置默认值。

在您的情况下,有两列具有 NULL 值,这对 SQL Server 没有任何意义,因此它无法从“Child”表中删除该行。想一想,你可能有数百万这样的数据,SQL SERVER 必须删除哪些空行?他怎么会知道?

如果您使用相同的值更新两列,然后运行删除,您将看到删除级联工作正常,或者您可以为这两列设置默认值。它会工作得很好。

因此您必须为使用此值的列设置默认值。

© www.soinside.com 2019 - 2024. All rights reserved.