2017-04-09 16 views
0

我有一个数据库表,其中有几个表用于其他几个表中。因此,给定的表可能会有一个“StateID”列,其中包含表示字符串“NJ”的“列表值”表中的数字(主键)。所以表示“NJ”的主键(整数)可以用在几个不同表中的不同列中。如何确定数据库中是否仍然使用查找值

现在我想允许用户删除这个“列表值”条目,但只有当它没有在任何地方使用。或者,我希望有一个可以在任何可能使用的主键值处更改此默认值的sproc,该默认值仍然存在。

有没有很好的方法来做到这一点?或者当我显示“NJ”时,为了说明我的代码中缺少关键值,是否会更好?如果“NJ”不再存在,它会显示默认值?

+0

如果你有一个合适的外键约束,只要尝试删除数据库就会引发一个错误,如果该行仍然被引用。 –

回答

2

首先,我不知道删除值是否是一个好主意,因为它们目前没有被使用。新泽西州所有这些好人和事物都可能希望有机会在未来的数据中表现出来。

其次,最好的办法是设计数据库时使用外键约束,每次引用另一个表。那么很容易:

delete from t 
    where t.value = 'NJ'; 

然后 - 除非你已覆盖默认的行为 - 而任何其他行指的是它不能删除该行。这是外键约束力的一部分。

唉,如果你没有约束,那么数据库不知道可能是指哪一行。如果你这样做,你可以检查所有可能的表格。但是,你可能会错过一个,然后事情就不会那么好。

因此,了解外键约束并在设计数据库时使用它们。

另一种可能更安全的方法是在查找表中有一个isDeleted标志。然后使用仅选择未删除的行的视图。您可以查看典型查询中是否缺少任何内容。

+0

我倾向于同意你的第一个陈述,这可能是我最终决定的(只是不让他们删除)。但是我认为可能会出现这种情况,他们希望从下拉列表中删除一个项目,从而在记录加载并且下拉列表中不包含相应的查找值时导致问题。所以我想我会看看是否有相对简单的选择。 –

+0

@StarfleetSecurity。 。 。如果您只想从下拉列表中删除值,请在该行上使用可见性标志。 –

相关问题