我有一个数据库表,其中列表值在其他几个表中使用。因此,给定的表可能具有“StateID”列,其中“list values”表中的数字(主键)表示字符串“NJ”。因此,表示“NJ”的主键(整数)可能会在几个不同的表中的几个不同列中使用。
现在我想允许用户删除此“列表值”条目,但仅限于它未在任何地方使用。或者,我希望有一个可以在任何可能使用的地方更改此主键值的sproc到一些仍然存在的“默认”值。
这样做有好办法吗?或者,当我显示“NJ”时,如果我的代码中缺少键值,那么我会更好吗?如果“NJ”不再存在,它会显示默认值吗?
答案 0 :(得分:2)
首先,我不知道删除值是否是一个好主意,因为它们当前没有被使用。新泽西州所有那些善良的人和事物可能希望有机会在未来的数据中出现。
其次,执行此操作的最佳方法是在每次引用另一个表时使用外键约束设计数据库。然后很容易:
delete from t
where t.value = 'NJ';
然后 - 除非您已覆盖默认行为 - 否则在任何其他行引用该行时您无法删除该行。这是外键约束力的一部分。
唉,如果您没有约束,那么数据库不知道可以引用该行的内容。如果这样做,您可以检查所有可能的表格。但是,你可能会错过一个,然后事情就不会那么好了。
因此,了解外键约束并在设计数据库时使用它们。
可能更安全的替代方法是在查找表中包含isDeleted
标志。然后使用仅选择未删除行的视图。您可以查看典型查询中是否缺少任何内容。