如何使用SQL Server级联删除?
我有2个表:T1和T2,他们是现有的数据表。 我们在T1和T2之间有一对多的关系。 如何删除T1中的logging时,如何更改表定义以在SQL Server中执行级联删除,同时还删除了T2中的所有关联logging。
他们之间存在着外来的约束。 我不想删除表或创build触发器来删除T2。 例如,当我删除一个员工时,所有的审核logging也应该消失。
T1 – 员工,
Employee ID Name Status
T2 – 性能评测,
Employee ID - 2009 Review Employee ID - 2010 Review
你将需要,
- 删除现有的外键约束,
- 在
ON DELETE CASCADE
设置启用的ON DELETE CASCADE
添加一个新的。
就像是:
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
将“级联删除”添加到SQL Server Management Studio中的现有外键:
首先,select您的外键,并在新的查询窗口中打开它的“DROP and Create To ..”。
然后,将ON DELETE CASCADE
添加到ADD CONSTRAINT
命令:
然后点击“执行”button来运行这个查询。
顺便说一句,要得到您的外键的列表,并查看哪些已打开“级联删除”,您可以运行此脚本:
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
如果您发现由于外键约束而无法DROP
特定的表,但无法确定哪个FK导致了问题,那么您可以使用我在此处提供的SQL:
如何列出在SQL Server中引用给定表的所有外键?
该文章中的SQL列出了引用特定表的所有FK。
希望这一切都有帮助。
特别是长指。
你可以用SQL Server Management Studio来做到这一点。
→右键单击表格devise,select关系,然后在左侧窗格和右侧窗格中select外键,展开菜单“插入和更新规范”,select“级联”作为删除规则。
使用类似的东西
ALTER TABLE T2 ADD CONSTRAINT fk_employee FOREIGN KEY (employeeID) REFERENCES T1 (employeeID) ON DELETE CASCADE;
填写正确的列名称,你应该设置。 正如mark_s正确说明的那样,如果你已经有一个外键约束,你可能需要先删除旧的,然后创build一个新的。
首先启用ONCascade属性:
1.删除现有的外键约束
2.在ON DELETE CASCADE设置启用的情况下添加一个新的
例如:
IF EXISTS(SELECT 1 FROM sys.foreign_keys WHERE parent_object_id = OBJECT_ID(N'dbo.Response')) BEGIN ALTER TABLE [dbo].[Response] DROP CONSTRAINT [FK_Response_Request] ALTER TABLE [dbo].[Response] WITH CHECK ADD CONSTRAINT [FK_Response_Request] FOREIGN KEY([RequestId]) REFERENCES [dbo].[Request] ([RequestId]) ON DELETE CASCADE END ELSE BEGIN ALTER TABLE [dbo].[Response] WITH CHECK ADD CONSTRAINT [FK_Response_Request] FOREIGN KEY([RequestId]) REFERENCES [dbo].[Request] ([RequestId]) ON DELETE CASCADE END
其次要禁用ONCascade属性:
1.删除现有的外键约束
2.在ON DELETE NO ACTION设置启用的情况下添加一个新的
例如:
IF EXISTS(SELECT 1 FROM sys.foreign_keys WHERE parent_object_id = OBJECT_ID(N'dbo.Response')) BEGIN ALTER TABLE [dbo].[Response] DROP CONSTRAINT [FK_Response_Request] ALTER TABLE [dbo].[Response] WITH CHECK ADD CONSTRAINT [FK_Response_Request] FOREIGN KEY([RequestId]) REFERENCES [dbo].[Request] ([RequestId]) ON DELETE CASCADE END ELSE BEGIN ALTER TABLE [dbo].[Response] WITH CHECK ADD CONSTRAINT [FK_Response_Request] FOREIGN KEY([RequestId]) REFERENCES [dbo].[Request] ([RequestId]) ON DELETE NO ACTION END
ON 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,数量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删除父表中的数据时删除子表中相应的logging。 因此,在此示例中,如果从产品表中删除了product_id值,那么使用此product_id的库存表中的相应logging也将被删除。
我认为你不能只删除表属性,如果这是实际的生产数据,只是删除不影响表模式的内容。