2017-11-09 22 views
2

私のテーブルのフィールドの1つにNOT NULL contstraintを追加したいのですが、別のフィールドに特定の値があるときだけです。PostgreSQLのカスタム非null制約

だから私はservicesテーブルを持っている:

services: 
- id 
- professional_id 
- is_master 

私はis_masterがfalseの時はいつでもprofessional_idはnullにすることはできませんというSQL制約を書きたいです。私は次のようなことを試しました:

CREATE TABLE "services" (
    "id" text NOT NULL, 
    "professional_id" text REFERENCES professionals ON DELETE CASCADE ON UPDATE CASCADE, 
    EXCLUDE USING gist (
     professional_id WITH =, 
    ) WHERE (NOT is_master), 
    "is_master" boolean NOT NULL DEFAULT false, 
    PRIMARY KEY ("id") 
); 

このSQLを書く正しい方法は何ですか?

+0

https://www.postgresql.org/docs/9.1/static/sql-createtrigger.html –

+1

'check(is_masterとprofessional_idがnullではない)を達成するためのトリガーを作成しますか? –

答えて

0

あなたはCHECK制約を使用することができます

CREATE TABLE "services" (
    "id" text NOT NULL, 
    "professional_id" text 
     CHECK (CASE WHEN "is_master" IS FALSE AND "professional_id" IS NULL 
       THEN FALSE ELSE TRUE END), -- and rest of FK 
    "is_master" boolean NOT NULL DEFAULT false, 
    PRIMARY KEY ("id") 
); 

Rextester Demo

INSERT INTO services 
VALUES (1,1, FALSE); 

INSERT INTO services 
VALUES (2,1, true); 

INSERT INTO services 
VALUES (3, null, true); 

INSERT INTO services 
VALUES (4, null, false); 

23514:関係 "サービス" のための新しい行がチェック制約に違反する "services_check"

2
check (not is_master and professional_id is not null or is_master) 
2

checkという制約でこれを行うことができます。簡単なものは次のとおりです。

constraint chk_services_master_professions 
    check (is_master or professional_id is not null) 

注:このバージョンはis_masterNULLことはありませんことを前提として - またはNULLは「偽」と同等であること。

+0

これは最もクリーンなものですが、私はすでにこれを見る前に他の答えを受け入れていました。 – Rodrigo

関連する問題