PostgreSQL自定义非空约束

时间:2017-11-09 15:51:05

标签: sql postgresql

我想在我的一个表字段中添加一个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的正确方法是什么?

3 个答案:

答案 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;