Sha*_*mad 10 sql-server-2008-r2
我只是注意到很少有表具有不再指向任何主键的孤立记录(外键)。如何查询表以获取所有此类行的列表?当这些父记录被删除或如何处理?
我正在使用 SQL Server 2008 R2,我们试图在清理后将 3 个类似的数据库导入一个,请指教。
编写示例子表 (DocumentDistribution) 和父表 (DocumentSource) 的脚本:
ALTER TABLE [dbo].[DocumentDistribution] WITH NOCHECK ADD CONSTRAINT [fk_documentdistsourceid_documentsourceid] FOREIGN KEY([DocumentDistSourceID]) REFERENCES [dbo].[DocumentSource] ([DocumentSourceID])
GO
ALTER TABLE [dbo].[DocumentDistribution] CHECK CONSTRAINT [fk_documentdistsourceid_documentsourceid]
Run Code Online (Sandbox Code Playgroud)
这不是告诉我表之间存在关系并明确定义了外键约束吗?
Aar*_*and 24
只有在您知道但 SQL Server 不知道的表之间存在关系时,这才应该是可能的。
SELECT fk
FROM dbo.ChildTable AS c
WHERE NOT EXISTS
(
SELECT pk FROM dbo.ParentTable AS p
WHERE p.pk = c.fk
);
Run Code Online (Sandbox Code Playgroud)
现在,将来,明确定义这种关系,那么人们将无法在子行仍然存在的情况下删除父行。要删除今天不应该存在的行:
DELETE c
FROM dbo.ChildTable AS c
WHERE NOT EXISTS
(
SELECT pk FROM dbo.ParentTable AS p
WHERE p.pk = c.fk
);
Run Code Online (Sandbox Code Playgroud)
接下来,剥夺他们禁用这些约束的权利,以便他们停止以错误的方式执行此操作。