我想在我的一个表字段中添加一个NOT NULL约束,但仅当另一个字段具有特定值时才会这样。
所以我有一个services
表:
services:
- id
- professional_id
- is_master
我想编写一个SQL约束,只要is_master
为false professional_id
,就不能为空。我尝试过这样的事情:
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 :(得分:2)
check (not is_master and professional_id is not null or is_master)
答案 1 :(得分:2)
您可以使用check
约束来执行此操作。一个简单的问题是:
constraint chk_services_master_professions
check (is_master or professional_id is not null)
注意:此版本假定is_master
永远不会NULL
- 或NULL
等同于" false"。
答案 2 :(得分: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:关系&#34;服务&#34;的新行违反了检查约束&#34; services_check&#34;