web-dev-qa-db-ja.com

postgresqlに2つのうち1つの非NULL制約を追加する

Postgresqlにテーブルがある場合:

create table Education ( 
    id                  integer references Profiles(id),
    finished            YearValue not null,
    started             YearValue,
    qualification       text,
    schoolName          text,
    studiedAt           integer references Organizations(id),
    primary key (id)
);

schoolNameまたはstudiedAtのいずれかがnullにならないように制約を作成する必要があります(そのうちの1つに情報が含まれている必要があります)。

どうすればよいですか?

30
Jimmy

チェック制約 を使用できます。例:.

constraint chk_education check (schoolName is not null or studiedAt is not null)

マニュアルから:

チェック制約は、最も一般的な制約タイプです。これにより、特定の列の値がブール(真理値)式を満たす必要があることを指定できます。

編集:Pithylessの解釈に準拠するための代替手段:

constraint chk_education check ((schoolName is not null and studiedAt is null) or (schoolName is null and studiedAt is not null))
34
Aleksi Yrttiaho

更新および挿入時にトリガーを使用して、データをテーブルに許可する前にルールが守られていることを確認することもできます。通常、チェック制約がより複雑なロジックを必要とする場合は、このタイプのアプローチを使用します。

0
Kuberchaun