postgresql 排它约束

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介: --pg支持 EXCLUSION Constraint,排它约束是约束中定义的操作计算结果为false,则不允许插入Exclusion constraints ensure that if...
--pg支持 EXCLUSION Constraint,排它约束是约束中定义的操作计算结果为false,则不允许插入
Exclusion constraints ensure that if any two rows are compared on the specified columns or expressions using the specified operators, at least one of these operator comparisons will return false or null.

--排它约束会自动建立一个索引,且为gist索引
Exclusion constraints are implemented using an index,The access method must support amgettuple; at present this means GIN cannot be used. 
Although it’s allowed, there is little point in using B-tree or hash indexes with an exclusion constraint, because this does nothing that an ordinary unique constraint doesn’t do better. 
So in practice the access method will always be GiST or SP-GiST

--引入btree_gist扩展
postgres=#  CREATE EXTENSION btree_gist;
CREATE EXTENSION

--否则创建表时会报错
ERROR:  data type text has no default operator class for access method "gist"
HINT:  You must specify an operator class for the index or define a default operator class for the data type.

--创建测试表
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不相同则pg允许插入,否则不允许插入
   AGE WITH <>)  --其比较的结果是如果整个表边式返回true,则不允许插入,否则允许
);
  --插入测试数据
 INSERT INTO COMPANY7 VALUES(1, 'Paul', 32, 'California', 20000.00 );
 --此条数据的name与第一条相同,且age与第一条也相同,故满足插入条件
 INSERT INTO COMPANY7 VALUES(2, 'Paul', 32, 'Texas', 20000.00 );
 INSERT INTO COMPANY7 VALUES(3, 'Allen', 42, 'California', 20000.00 );
 
 --此数据与上面数据的name相同,但age不相同,故不允许插入
postgres=# INSERT INTO COMPANY7 VALUES(2, 'Paul', 33, 'Texas', 20000.00 );       
ERROR:  duplicate key value violates unique constraint "company7_pkey"
DETAIL:  Key (id)=(2) already exists.

--查询数据库中在排序约束中可以使用的操作符
SELECT am.amname AS index_method,
opf.opfname AS opfamily_name,
amop.amopopr::regoperator AS opfamily_operator
FROM pg_am am, pg_opfamily opf, pg_amop amop
WHERE opf.opfmethod = am.oid AND
amop.amopfamily = opf.oid and amname like 'gist'
ORDER BY index_method, opfamily_name, opfamily_operator;

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
关系型数据库 数据库 PostgreSQL
开发踩坑记录之三:PostgreSQL数据库表唯一性约束失效
在设计数据库表过程中,我们通常会对数据库表进行唯一性约束,以防止事务不一致导致的相同数据的重复插入问题。但是在实际开发中发现,即使设置了数据库表的唯一性约束,仍然出现了相同数据重复插入的问题。
|
弹性计算 关系型数据库 测试技术
PostgreSQL 分区表如何支持多列唯一约束 - 枚举、hash哈希 分区, 多列唯一, insert into on conflict, update, upsert, merge insert
标签 PostgreSQL , 分区表 , native partition , 唯一 , 非分区键唯一 , 组合唯一 , insert into on conflict , upsert , merge insert 背景 PG 11开始支持HASH分区,10的分区如果要支持hash分区,可以通过枚举绕道实现。 《PostgreSQL 9.x, 10, 11 hash分区表 用法举例
2906 0
|
存储 关系型数据库 PostgreSQL
PostgreSQL PostGIS 空间数据约束使用
标签 PostgreSQL , PostGIS , 空间数据约束 背景 空间数据有一定的规范,例如SRID的规范。空间类型geometry包罗万象,除了能存储POINT,还能存储多边形,线段等。 这就带来一个有意思的烦恼,当我们业务不够规范时,你可以往GEOMETRY里面存储任意SRID的数据,存储任意的空间对象。
1200 0
|
SQL 关系型数据库 数据库
PostgreSQL 10.1 手册_部分 II. SQL 语言_第 5 章 数据定义_5.3. 约束
5.3. 约束 5.3.1. 检查约束 5.3.2. 非空约束 5.3.3. 唯一约束 5.3.4. 主键 5.3.5. 外键 5.3.6. 排他约束 数据类型是一种限制能够存储在表中数据类别的方法。
1066 0
|
关系型数据库 测试技术 C语言
PostgreSQL 另类advisory lock保证唯一约束法
在没有唯一约束或者主键约束时,数据库是不保证唯一性的。那么有什么手段来保证呢? 方法 1. 串行操作,先查询,如果没有查到记录,则插入。 这种方法效率非常低: 测试如下: postgres=# create table tbl(c1 text); CREATE TABLE
4416 0