3

チェック制約が少ない方が良いのか、それとも多いのかについての提案はありますか?仮にあったとしても、それらをどのようにグループ化する必要がありますか?

である3つの列がありVARCHAR2(1 BYTE)、それぞれが「T」/「F」フラグであるとします。IN ('T', 'F')文字のみを許可するように指定するチェック制約を各列に追加したいと思います。

列ごとに1つずつ、3つの個別のチェック制約がある必要があります。

COL_1 IN ('T', 'F')

COL_2 IN ('T', 'F') 

COL_3 IN ('T', 'F')

または単一のチェック制約:

COL_1 IN ('T', 'F') AND COL_2 IN ('T', 'F') AND COL_3 IN ('T', 'F')

列は論理的に相互に関連していないため、これら3つを分離しておくのが最善だと思います。複数の列を調べるチェック制約がある唯一のケースは、ある列の値と別の列の値の間に何らかの関係があったかどうかです。例:

(PARENT_CNT > 0 AND PRIMARY_PARENT IS NOT NULL) OR (PARENT_CNT = 0 AND PRIMARY_PARENT IS NULL)
4

3 に答える 3

8

別々にしてください、それらは異なる列です。また、エラーメッセージには、失敗したチェック制約名が表示され、問題がどこにあるかがわかります。将来の開発者は、なぜそれらがすべて一緒になっているのか混乱するか、またはそれらが別の列にあるためにそれらに気付かないでしょう。

于 2010-03-16T19:22:04.523 に答える
0

varcharはまったく使用しないことをお勧めします。これは、ブールデータ型のないデータベースにブール値を格納する方法の標準的な方法ではありません。0 = False、非ゼロ=Trueの最小の整数型をお勧めします。この時点でチェックする制約は簡単になります(不要な場合でも)。

批判への対処:デバッグとメンテナンスの理由(エラーの改善、ロギング)のために3つの制約を設ける必要があります。挿入と更新でパフォーマンスがわずかに低下する可能性がありますが、大したことはありません。

于 2010-03-16T19:42:14.553 に答える
-1

列間に依存関係がある場合は、2つの列にチェック制約を一緒に使用できます。

たとえば、グローバルIDとローカルIDがある場合、両方のような条件が必要な場合はnullにすることはできません。そして、それらの一方がnullであるか、両方がnullではないことが許可されます。ただし、どちらか一方がnullでないか、両方がnullでないことを確認する必要があります。

例:2つの列BatchId int NULLSuperBatchId int NULL。次に、私のチェック制約は

CHECK((BatchId  IS NOT NULL) OR (SuperBatchId  IS NOT NULL))

これは、2列のチェック制約の例です。

于 2016-04-09T09:39:18.633 に答える