2017-04-09 19 views
0

私はいくつかの他のテーブルで使用されるリスト値を持つデータベーステーブルを持っています。したがって、指定された表には、 "NJ"という文字列を表す "リスト値"テーブルの番号(主キー)を持つ "StateID"列があります。したがって、「NJ」を表す主キー(整数)は、いくつかの異なる表にまたがる複数の異なる列で使用される可能性があります。ルックアップ値がまだDB内で使用されているかどうかを判断する方法

ここでは、ユーザーがこの「リスト値」エントリを削除できるようにしたいが、どこでも使用されていない場合にのみ削除することができます。あるいは、このプライマリキーの値をどこでも使用できるように変更するsprocと、まだ存在する「デフォルト」の値を設定したいと考えています。

これを行うには良い方法がありますか?または、 "NJ"を表示したときにコード内にキー値が存在しないことを考慮して、 "NJ"が存在しなくなった場合にデフォルト値を表示する方が良いでしょうか?

+0

適切な外部キー制約がある場合、削除を試行するだけで、その行がまだ参照されていれば、データベースはエラーをスローします。 –

答えて

2

まず、現在使用されていないという理由だけで値を削除することをお勧めしますか?ニュージャージー州のこれらのすてきな人々や物事は、将来的にデータに表現される機会を望んでいるかもしれません。

第2に、別のテーブルを参照するたびに、外部キー制約を使用してデータベースを設計することをお勧めします。そして、それは簡単です:

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

その後 - あなたはデフォルトの動作を上書きしていない限り - 他の行がそれを参照しながら、あなたは行を削除することはできません。それは外部キー制約の力の一部です。

悲しいことに、制約がない場合、データベースはの行を参照できるかどうかわかりません。そうした場合は、すべてのテーブルをチェックすることができます。しかし、あなたが1つを欠場する可能性がありますし、物事はうまく動作しません。

したがって、外部キーの制約について学び、データベースを設計する際に使用してください。

安全かもしれない別のアプローチは、ルックアップテーブルにisDeletedフラグを持つことです。次に、削除されていない行のみを選択するビューを使用します。一般的なクエリに何かがないかどうかを確認できます。

+0

私はあなたの最初の声明に同意する傾向があり、それはおそらく私が最終的に(それらを削除させないように)決めるだろう。しかし、ドロップダウンからアイテムを削除したいので、レコードがロードされ、ドロップダウンに対応するルックアップ値が含まれていないときに問題が発生するケースが考えられました。だから私は、それに関して比較的簡単な選択肢があるかどうかを知ることができると思った。 @StarfleetSecurity。 –

+0

。 。ドロップダウンから値を削除したいだけの場合は、行に可視性フラグを使用します。 –