【问题标题】:PostgreSQL Custom not null constraintPostgreSQL 自定义非空约束
【发布时间】:2017-11-10 00:09:43
【问题描述】:

我想向我的一个表字段添加一个 NOT NULL 约束,但前提是另一个字段具有特定值。

所以我有一个services 表:

services:
 - id
 - professional_id
 - is_master

我想写一个 SQL 约束,只要is_master 为假,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 的正确方法是什么?

【问题讨论】:

标签: sql postgresql


【解决方案1】:

您可以使用check 约束来执行此操作。一个简单的方法是:

constraint chk_services_master_professions
    check (is_master or professional_id is not null)

注意:此版本假定 is_master 永远不会是 NULL -- 或者 NULL 等同于“false”。

【讨论】:

  • 这是最干净的,但在看到这个之前我已经接受了另一个答案。
  • @Rodrigo:你知道你可以切换选择的答案吗?
【解决方案2】:
check (not is_master and professional_id is not null or is_master)

【讨论】:

    【解决方案3】:

    您可以使用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”的新行违反了检查约束“services_check”

    【讨论】:

      猜你喜欢
      • 2014-09-19
      • 2021-05-14
      • 1970-01-01
      • 2016-01-18
      • 2011-07-23
      • 2017-02-08
      • 2016-11-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多