我有两个表。T1和T2,它们是有数据的现有表。 我们在T1和T2之间有一个一对多的关系。 我如何改变表的定义,以便在SQL Server中执行级联删除,当T1的记录被删除时,T2的所有相关记录也被删除。
它们之间的外来约束是到位的。我不想放弃这些表或创建一个触发器来为T2进行删除。例如,当我删除一个员工时,所有的审查记录也应该被删除。
T1 - 雇员。
Employee ID
Name
Status
T2 - 绩效审查。
Employee ID - 2009 Review
Employee ID - 2010 Review
你将需要。
就像这样。
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中的现有外键。
首先,选择你的外键,并在新的查询窗口中打开它的"DROP和Create To..." 在一个新的查询窗口中。
[![在此输入图片描述][1]][1] 。
然后,在 "ADD CONSTRAINT "命令中加上 "ON DELETE CASCADE "即可。
[![n][2]][2] 并点击"Execute"。 按钮来运行这个查询。
顺便说一下,要想获得你的外键列表,并查看哪些外键已经打开了"级联删除" 开启,你可以运行这个脚本。
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造成的问题,那么你可以运行这个命令。
sp_help 'TableName'
那篇文章中的SQL列出了所有引用某个表的FK。
希望这些都能帮到你。
为长指道歉。 我只是想表达一个观点。
[1]: http://i.stack.imgur.com/pGVTp.png [2]: http://i.stack.imgur.com/uavp9.png
你可以用SQL Server Management Studio来完成。
→ 右键单击表设计并进入 "关系",在左侧窗格中选择外键,在右侧窗格中,展开菜单"INSERT和UPDATE规范"。 并选择"Cascade"。 作为删除规则。
![SQL Server Management Studio][1] 。
"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,
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值,那么库存表中使用这个product_id的相应记录也会被删除。
首先启用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