声明:以下内容看完文档仅个人理解,仅供参考,详见下方参考资料。
约束(constraint)
约束分为检查约束(Check Constraints)、非空约束(Not-Null Constraints)、唯一约束(Unique Constraints)、主键(Primary Keys)、外键(Foreign Keys)、排他约束(Exclusion Constraints)。所有约束都可以成为命名约束,创建时带constraint 关键字。
检查约束如:
CREATE TABLE products (
product_no integer,
name text,
price numeric CHECK (price > 0)
);
也可以加命名约束:
CREATE TABLE products (
product_no integer,
name text,
price numeric CONSTRAINT positive_price CHECK (price > 0)
);
列约束与表约束:
CREATE TABLE products (
product_no integer,
name text,
price numeric CHECK (price > 0), # 列约束
discounted_price numeric CHECK (discounted_price > 0), #列约束
CHECK (price > discounted_price) #表约束
);
非空约束:
CREATE TABLE products (
product_no integer NOT NULL,
name text NOT NULL,
price numeric NOT NULL CHECK (price > 0)
);
唯一约束:
#列约束写法
CREATE TABLE products (
product_no integer UNIQUE,
name text,
price numeric
);
#表约束写法
CREATE TABLE products (
product_no integer,
name text,
price numeric,
UNIQUE (product_no)
);
主键约束
一个主键约束表示可以用作表中行的唯一标识符的一个列或者一组列。这要求那些值都是唯一的并且非空。因此,下面的两个表定义接受相同的数据:
CREATE TABLE products (
product_no integer UNIQUE NOT NULL,
name text,
price numeric
);
CREATE TABLE products (
product_no integer PRIMARY KEY,
name text,
price numeric
);
主键也可以包含多于一个列,其语法和唯一约束相似:
CREATE TABLE example (
a integer,
b integer,
c integer,
PRIMARY KEY (a, c)
);
增加一个主键将自动在主键中列出的列或列组上创建一个唯一B-tree索引。并且会强制这些列被标记为NOT NULL。
一个表最多只能有一个主键(可以有任意数量的唯一和非空约束,它们可以达到和主键几乎一样的功能,但只能有一个被标识为主键)。
外键
这个在实际生产中应用很少,外键得作用里边不会出现冗余数据,有外键得表依赖被引用得表,外键约束得那一列,必须都是被引用表存在得值,如果不存在,或者对主表操作删除时,外键都会起到级联删除或者由于外键得作用无法操作。
排他约束
排他约束保证如果将任何两行的指定列或表达式使用指定操作符进行比较,至少其中一个操作符比较将会返回否或空值。
详见:http://www.postgres.cn/docs/12/sql-createtable.html#SQL-CREATETABLE-EXCLUDE
参考资料
https://www.postgresql.org/docs/12/ddl-constraints.html
http://www.postgres.cn/docs/12/ddl-constraints.html
http://www.postgres.cn/docs/12/sql-createtable.html#SQL-CREATETABLE-EXCLUDE