PGSQL学习心得之EXCLUSION约束

EXCLUSION 约束

EXCLUSION 约束确保如果使用指定的运算符在指定列或表达式上比较任意两行,至少其中一个运算符比较将返回 false 或 null。

实例

下面实例创建了一张 COMPANY7 表,添加 5 个字段,并且使用了 EXCLUDE 约束。

CREATE TABLE COMPANY7(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT,
   AGE            INT  ,
   ADDRESS        CHAR(50),
   SALARY         REAL,
   EXCLUDE USING gist
   (NAME WITH =,  -- 如果满足 NAME 相同,AGE 不相同则不允许插入,否则允许插入
   AGE WITH <>)   -- 其比较的结果是如果整个表达式返回 true,则不允许插入,否则允许
);

这里,USING gist 是用于构建和执行的索引一种类型。

您需要为每个数据库执行一次 CREATE EXTENSION btree_gist 命令,这将安装 btree_gist 扩展,它定义了对纯标量数据类型的 EXCLUDE 约束。

由于我们已经强制执行了年龄必须相同,让我们通过向表插入记录来查看这一点:

INSERT INTO COMPANY7 VALUES(1, 'Paul', 32, 'California', 20000.00 );
INSERT INTO COMPANY7 VALUES(2, 'Paul', 32, 'Texas', 20000.00 );
-- 此条数据的 NAME 与第一条相同,且 AGE 与第一条也相同,故满足插入条件
INSERT INTO COMPANY7 VALUES(3, 'Allen', 42, 'California', 20000.00 );
-- 此数据与上面数据的 NAME 相同,但 AGE 不相同,故不允许插入

前面两条顺利添加的 COMPANY7 表中,但是第三条则会报错:

ERROR:  conflicting key value violates exclusion constraint "company7_name_age_excl"
DETAIL:  Key (name, age)=(Paul, 42) conflicts with existing key (name, age)=(Paul, 32).

个人验证

以上是教学网站的内容

根据教学所说,该条记录是无法插入的

INSERT INTO COMPANY7 VALUES(3, 'Allen', 42, 'California', 20000.00 );

但实际上是可以插入的

PGSQL学习心得之EXCLUSION约束_第1张图片

这里应该是教学网站的失误,依据内容而言,应该是

INSERT INTO COMPANY7 VALUES(3, 'Paul', 42, 'California', 20000.00 );

运行时报错

PGSQL学习心得之EXCLUSION约束_第2张图片

总结

exclude using gist (name with = ,age with <>)

该句的约束为如果name相同,那么age必须相同,否则报错,其他无限制。

所以能看到这样的结果

PGSQL学习心得之EXCLUSION约束_第3张图片

有点像mysql中联合索引的校验,但是又不是,说不上来有什么联系。

希望能有大佬指点迷津!

你可能感兴趣的:(数据库,数据库)