如何删除行而不删除依赖行

时间:2018-02-05 15:54:20

标签: sql-server

如果已有答案,请将我重定向到那里。谷歌这个话题给了我很多不相干的结果。我是SQL新手,为大学做项目,我的问题是: 我正在制作某种薪资系统。我数据库中的一些表格(翻译成英文):“DEDUCTIONS” - 与“付款”相关 - 与“员工”相关。我创建了一个视图“薪资报告”,它结合了这些表格中的数据,因此可以深入了解以前的所有薪水。但是,当我尝试执行这个简单的查询时:

DELETE FROM Employees WHERE EmployeeID=@ID

我收到以下错误:DELETE语句与REFERENCE约束冲突....

现在,我确实意识到,与员工一起删除其他表中的行可以解决问题,但我真的想保留报表的数据,即使我删除了员工。我想添加另一个表来保存这些报告,但我觉得这会导致数据冗余,让我相信如果我错了。对此有什么简单的解决方案吗?

2 个答案:

答案 0 :(得分:0)

你所做的并不是最好的主意,因为(如你所说)你有报告需要历史数据的依赖关系。

虽然您可以使用ALTER TABLE执行此类操作并禁用外键检查:

ALTER TABLE SET FOREIGN_KEY_CHECKS=0;

您真正的解决方案可能是添加数据。当您处理历史问题和报告时,通过禁用约束来删除数据仍然会在您删除记录时中断报告。相反,通常最好使用“IsDeleted”布尔/位列或类似的方法来取消激活记录,然后只需修改相关查询以检查“IsDeleted = 1”或“IsDeleted = false”,或者您决定标记它。由于历史原因,这维护了数据。

如果数据库文件大小已成为问题,并且增加存储空间不是一个合理的解决方案,那么您的组织应该检查它想要保留记录的时间,注册备份策略以按计划备份数据库(即发送到Iron Mountain的磁带,基于云的服务等),存储这些备份以用于存档目的,并且只删除活动表中的记录,这些记录已经足够大,在日常实践中已经失去意义。

答案 1 :(得分:0)

您可以将错误中的约束更改为不检查约束条件,如下所示:

ALTER TABLE Employees NOCHECK CONSTRAINT ConstraintName