Sql server 如何在SQL Server中使用级联删除?

Sql server 如何在SQL Server中使用级联删除?,sql-server,cascading-deletes,Sql Server,Cascading Deletes,我有两个表:T1和T2,它们是包含数据的现有表。我们在T1和T2之间有一对多的关系。当删除T1中的记录时,如何更改表定义以在SQL Server中执行级联删除,同时删除T2中的所有关联记录 他们之间存在着外部约束。我不想删除表或创建触发器来删除T2。例如,当我删除一名员工时,所有的审核记录也应该消失 T1-雇员 Employee ID Name Status T2-绩效审查 Employee ID - 2009 Review Employee ID - 2010 Review 使

我有两个表:T1和T2,它们是包含数据的现有表。我们在T1和T2之间有一对多的关系。当删除T1中的记录时,如何更改表定义以在SQL Server中执行级联删除,同时删除T2中的所有关联记录

他们之间存在着外部约束。我不想删除表或创建触发器来删除T2。例如,当我删除一名员工时,所有的审核记录也应该消失

T1-雇员

Employee ID      
Name
Status
T2-绩效审查

Employee ID - 2009 Review
Employee ID - 2010 Review
使用类似

ALTER TABLE T2
ADD CONSTRAINT fk_employee
FOREIGN KEY (employeeID)
REFERENCES T1 (employeeID)
ON DELETE CASCADE;
填写正确的列名,您应该被设置。正如mark_s正确指出的那样,如果您已经有外键约束,您可能需要先删除旧的约束,然后创建新的约束。

您需要

  • 删除现有的外键约束
  • 在启用了“删除级联”设置的情况下添加一个新的
比如:

ALTER TABLE dbo.T2
   DROP CONSTRAINT FK_T1_T2   -- or whatever it's called

ALTER TABLE dbo.T2
   ADD CONSTRAINT FK_T1_T2_Cascade
   FOREIGN KEY (EmployeeID) REFERENCES dbo.T1(EmployeeID) ON DELETE CASCADE

首先启用ONCascade属性:

1.删除现有外键约束

2.添加一个启用了ON DELETE CASCADE设置的新文件

例:

禁用ONCascade属性的第二步:

1.删除现有外键约束

2.添加一个启用了ON DELETE NO ACTION(删除时无操作)设置的新操作

例:


您可以使用SQLServerManagementStudio执行此操作

→ 右键单击表设计并转到关系,在左侧窗格中选择外键,在右侧窗格中,展开菜单“插入和更新规范”,并选择“级联”作为删除规则

要在SQL Server Management Studio中将“级联删除”添加到现有外键,请执行以下操作:

首先,选择外键,并在新的查询窗口中打开它的“DROP and Create To…”

然后,只需将DELETE CASCADE上的
添加到
add CONSTRAINT
命令:

然后点击“执行”按钮运行此查询

顺便说一下,要获取外键列表,并查看哪些外键已启用“级联删除”,可以运行以下脚本:

SELECT 
   OBJECT_NAME(f.parent_object_id) AS 'Table name',
   COL_NAME(fc.parent_object_id,fc.parent_column_id) AS 'Field name',
   delete_referential_action_desc AS 'On Delete'
FROM sys.foreign_keys AS f,
     sys.foreign_key_columns AS fc,
     sys.tables t 
WHERE f.OBJECT_ID = fc.constraint_object_id
AND t.OBJECT_ID = fc.referenced_object_id
ORDER BY 1
如果您发现由于外键约束而无法
删除
特定表,但无法确定是哪个FK导致问题,则可以运行以下命令:

sp_help 'TableName'
该文章中的SQL列出了引用特定表的所有FK

希望所有这些都有帮助


我为我的长手指道歉。我只是想说明一点。

我认为您不能只删除tables属性。如果这是实际的生产数据,只需删除不影响表架构的内容。

关于delete CASCADE

它指定在删除父数据时删除子数据

CREATE TABLE products
( product_id INT PRIMARY KEY,
  product_name VARCHAR(50) NOT NULL,
  category VARCHAR(25)
);

CREATE TABLE inventory
( inventory_id INT PRIMARY KEY,
  product_id INT NOT NULL,
  quantity INT,
  min_level INT,
  max_level INT,
  CONSTRAINT fk_inv_product_id
    FOREIGN KEY (product_id)
    REFERENCES products (product_id)
    ON DELETE CASCADE
);

对于这个外键,我们指定了
ON DELETE CASCADE
子句,它告诉SQL Server在删除父表中的数据时删除子表中相应的记录。因此在本例中,如果从products表中删除product_id值,库存表中使用此产品id的相应记录也将被删除。

如果一对多关系是从T1到T2的关系,则它不表示函数,因此不能用于推断或推断反向函数,以确保生成的T2值不会忽略T1 join T2的元组,这些元组是演绎有效,因为没有演绎有效的反函数。(主键的目的是表示函数。)SQL think中的答案是肯定的,您可以这样做。关系思维的答案是不,你做不到。见Codd 1970中的歧义点。从T1到T2,关系必须是多对一。

@marc_s-实际上,您可以针对两侧完全相同的列添加第二个外键,它将正常工作。如果在没有停机的生产环境中工作,最好引入带有级联的新FK,然后删除旧FK,而不是在没有FK时在表上留下一个窗口。(刚刚在SQL 2008上测试过)这是正确的。我试过这个,效果很好。不需要删除第一个外键约束。感谢您的回复。您好,这4个选项之间有什么区别,打开cascade是否可以轻松删除表中的所有数据。如何查看此表(而不是此表)上的所有依赖项/fk键。即使删除了所有的FK,我仍然得到一个error@aggie-您可以通过右键单击表来检查依赖项->“查看依赖项”,sql server也会显示表名和列名的详细错误,如“DELETE语句与引用约束“FK_Child1\u Parent1”冲突。冲突发生在数据库中”TESTDB”,表“dbo.Child1”,列“Parent1ID”。@aggie-第四种情况“Set Default”是,您必须在外键列中设置默认约束,当我们删除父表时,子表中的默认值将被替换。(注意:默认值必须与父表匹配。)有关更多信息,请访问此网站。我想知道,为什么没有插入规则?换句话说,当我向T1添加一行时,我想自动创建T2中相应的条目。@RobertM。因为这毫无意义。它如何知道要插入哪些值?您可以使用插入触发器生成子行,尝试研究一下。我的团队和我就是这么做的。我们不得不放弃我们的限制,重新添加它们。这对我们很有效。这怎么会有利于硬删除?软删除永远不会有约束问题。似乎与我完全相反。@Maxx在硬删除中,您删除一条记录,不需要担心孤立的寄存器,而在软删除中,您需要手动执行。finger立即出售了这个答案。我刚刚从搜索引擎结果页面的“删除级联的图像”点击这里
sp_help 'TableName'
CREATE TABLE products
( product_id INT PRIMARY KEY,
  product_name VARCHAR(50) NOT NULL,
  category VARCHAR(25)
);

CREATE TABLE inventory
( inventory_id INT PRIMARY KEY,
  product_id INT NOT NULL,
  quantity INT,
  min_level INT,
  max_level INT,
  CONSTRAINT fk_inv_product_id
    FOREIGN KEY (product_id)
    REFERENCES products (product_id)
    ON DELETE CASCADE
);