gpt4 book ai didi

sql - 从具有多个外键的表中删除

转载 作者:行者123 更新时间:2023-12-04 05:14:19 26 4
gpt4 key购买 nike

目前我正在一个树状结构的数据库中工作。基本上有一个顶级表,并且大约有 10 个表在该表上具有外键。这些表中的每一个都有另外 10 个带有外键约束的表。现在我的目标是从主表中删除一些记录,并删除子、孙等,但当然外键使这成为一项艰巨的任务。

我搜索了一下,发现检查了这个 question关于使用级联删除,如果我只处理几个表,我想这会奏效。然而,在我目前的环境中,一张一张地改变 100 多张 table 仍然不会令人愉快。

因此,我问是否有一种简单的方法可以在涉及许多表时删除具有外键的值。

由于我对相对较小的数据库有一定的控制权,因此查询效率和值被其他人删除的风险并不是真正的问题。因此,在所有表上应用级联删除可能很容易,但我也对完全不同的解决方案持开放态度(在 microsoft server studio 2008 中使用 T-SQL)。

最佳答案

对于“主”表,删除级联将是一个很好的解决方案。

为避免手动更改所有表,您可以使用脚本,如 here稍作更改(最后一行,将 <yourTable> 更改为您的表名)。

select
DropStmt = 'ALTER TABLE [' + ForeignKeys.ForeignTableSchema +
'].[' + ForeignKeys.ForeignTableName +
'] DROP CONSTRAINT [' + ForeignKeys.ForeignKeyName + ']; '
, CreateStmt = 'ALTER TABLE [' + ForeignKeys.ForeignTableSchema +
'].[' + ForeignKeys.ForeignTableName +
'] WITH CHECK ADD CONSTRAINT [' + ForeignKeys.ForeignKeyName +
'] FOREIGN KEY([' + ForeignKeys.ForeignTableColumn +
']) REFERENCES [' + schema_name(sys.objects.schema_id) + '].[' +
sys.objects.[name] + ']([' +
sys.columns.[name] + ']) ON DELETE CASCADE; '
from sys.objects
inner join sys.columns
on (sys.columns.[object_id] = sys.objects.[object_id])
inner join (
select sys.foreign_keys.[name] as ForeignKeyName
,schema_name(sys.objects.schema_id) as ForeignTableSchema
,sys.objects.[name] as ForeignTableName
,sys.columns.[name] as ForeignTableColumn
,sys.foreign_keys.referenced_object_id as referenced_object_id
,sys.foreign_key_columns.referenced_column_id as referenced_column_id
from sys.foreign_keys
inner join sys.foreign_key_columns
on (sys.foreign_key_columns.constraint_object_id
= sys.foreign_keys.[object_id])
inner join sys.objects
on (sys.objects.[object_id]
= sys.foreign_keys.parent_object_id)
inner join sys.columns
on (sys.columns.[object_id]
= sys.objects.[object_id])
and (sys.columns.column_id
= sys.foreign_key_columns.parent_column_id)
) ForeignKeys
on (ForeignKeys.referenced_object_id = sys.objects.[object_id])
and (ForeignKeys.referenced_column_id = sys.columns.column_id)
where (sys.objects.[type] = 'U')
and (sys.objects.[name] = '<yourTable>')

您在 Management Studio 查询窗口中复制第一列结果,执行,然后对第二列执行相同操作,瞧,您就完成了。

关于sql - 从具有多个外键的表中删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14484081/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com