我有2个表:T1和T2,它们是带有数据的现有表。我们在T1和T2之间有一对多的关系。当删除T1中的记录时,如何更改表定义以在SQL Server中执行级联删除,T2中的所有关联记录也将被删除。
它们之间存在外来约束。我不想删除表或创建触发器来删除T2。例如,当我删除员工时,所有审核记录也应该消失。
T1 - 员工,
Employee ID
Name
Status
T2 - 绩效评估,
Employee ID - 2009 Review
Employee ID - 2010 Review
答案 0 :(得分:330)
你需要,
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
答案 1 :(得分:263)
添加"级联删除"到SQL Server Management Studio中的现有外键:
首先,选择您的外键,然后打开它" DROP和Create To .."在新的查询窗口中。
然后,只需将ON 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
如果您发现由于外键约束而无法DROP
某个特定的表格,但您无法确定哪个FK导致了问题,那么您可以运行这个命令:
sp_help 'TableName'
该文章中的SQL列出了引用特定表的所有FK。
希望这一切都有所帮助。
长指的道歉。我只是想说明一点。
答案 2 :(得分:152)
您可以使用SQL Server Management Studio执行此操作。
→右键单击表格设计并转到“关系”并在左侧窗格和右侧窗格中选择外键,展开“INSERT和UPDATE规范”菜单,然后选择“级联”作为删除规则。
答案 3 :(得分:42)
使用类似
的内容ALTER TABLE T2
ADD CONSTRAINT fk_employee
FOREIGN KEY (employeeID)
REFERENCES T1 (employeeID)
ON DELETE CASCADE;
填写正确的列名,您应该进行设置。正如mark_s正确陈述的那样,如果你已经有了外键约束,你可能需要先删除旧的约束,然后再创建一个旧约。
答案 4 :(得分:14)
首先启用ONCascade属性:
1.Drop现有的外键约束
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.Drop现有的外键约束
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
答案 5 :(得分:14)
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的相应记录。
答案 6 :(得分:-1)
如果一对多关系是从T1到T2,则它不表示一个函数,因此不能用来推论或推断一个反函数,以保证所得的T2值不会忽略T1的元组与T2联接,因为没有演绎有效的逆函数,所以演绎有效。 (表示函数是主键的目的。)SQL的答案是可以的。关系型思维的答案是不,你做不到。参见Codd 1970中的歧义点。从T1到T2,这种关系必须是多对一的。
答案 7 :(得分:-7)
我认为你不能只删除tables属性,如果这是实际的生产数据,只需删除不影响表模式的内容。