约束
mydb=# CREATE TABLE products (product_no integer,name text,price numeric CHECK (price > 0)); //添加约束 price > 0 CREATE TABLE mydb=# mydb=# mydb=# insert into products values(1,'aaa',2.11); INSERT 0 1 mydb=# insert into products values(1,'aaa',0); ERROR: new row for relation "products" violates check constraint "products_price_check" //违反约束,约束名由表名,约束字段+check组成 DETAIL: Failing row contains (1, aaa, 0). mydb=# drop table products; DROP TABLE mydb=# CREATE TABLE products (product_no integer,name text,price numeric CONSTRAINT positive_price CHECK (price > 0)); CREATE TABLE mydb=# insert into products values(1,'aaa',2.11); INSERT 0 1 mydb=# insert into products values(1,'aaa',0); ERROR: new row for relation "products" violates check constraint "positive_price"//违反约束,自定义的约束名报错 DETAIL: Failing row contains (1, aaa, 0). 约束不会阻止空值的插入 mydb=# insert into products values (1,'aa'); INSERT 0 1 mydb=# select * from products; product_no | name | price ------------+------+------- 1 | aaa | 2.11 1 | aa | (2 rows)
UNIQUE
唯一约束uniqe保证\在一列中或者一组列中保存的数据在表中所有行间是唯一的,
增加一个唯一约束会在约束中列出的列或列组上自动创建一个唯一B-tree索引
通常,如果表中有超过一行在约束所包括列上的值相同,将会违反唯一约束。但是在这种比较中,两个空值被认为是不同的
主键
个人理解:主键表示表中的主键列代表该行在表中的唯一性,并且主键列不为空//主键可以为单个字段或者多个列的组合,但必须保证在唯一性
官方解释:一个主键约束表示可以用作表中行的唯一标识符的一个列或者一组列。这要求那些值都是唯一的并且非空
primary key ,uniqe , FOREIGN KEY约束跨行和跨表限制。
增加一个主键将自动在主键中列出的列或列组上创建一个唯一B-tree索引。并且会强制这些列被标记为NOT NULL
表中可以有多个非空约束或者唯一约束,但是只能有一个主键
外键
CREATE TABLE cities ( city varchar(80) primary key, location point ); CREATE TABLE weather ( city varchar(80) references cities(city), temp_lo int, temp_hi int, prcp real, date date ); mydb=# INSERT INTO weather VALUES ('Berkeley', 45, 53, 0.0, '1994-11-28'); ERROR: insert or update on table "weather" violates foreign key constraint "weather_city_fkey" DETAIL: Key (city)=(Berkeley) is not present in table "cities".
外键,weather的外键为cities表的city字段,即cities的主键,如果cities表中没有city字段,则不能直接对相应的weather表进行操作
一个表可以有超过一个的外键约束,比如用户表可能对应着产品表和订单表,则用户表中就需要有产品和订单的外键
排他约束
CREATE TABLE t3(NAME TEXT,AGE INT,EXCLUDE USING gist(NAME WITH =,AGE WITH <>));
//(NAME WITH =, 如果满足 NAME 相同,AGE 不相同则不允许插入,否则允许插入
AGE WITH <>) 其比较的结果是如果整个表达式返回 true,则不允许插入,否则允许
name Or age
t t name相同,age不同 不允许插入
t f name相同,age相同 允许插入
f t name不同,age不同 不允许插入
f f name不同,age相同 允许插入
mydb=# CREATE TABLE t3(NAME TEXT,AGE INT,EXCLUDE USING gist(NAME WITH =,AGE WITH <>)); CREATE TABLE mydb=# mydb=# mydb=# insert into t3 values('aa',10); INSERT 0 1
name,age相同,允许插入
mydb=# insert into t3 values('aa',10); INSERT 0 1
name相同,age不同,不允许插入
mydb=# insert into t3 values('aa',11); ERROR: conflicting key value violates exclusion constraint "t3_name_age_excl" DETAIL: Key (name, age)=(aa, 11) conflicts with existing key (name, age)=(aa, 10).
name不同,age相同,允许插入
mydb=# insert into t3 values('bb',10); INSERT 0 1
name不同,age不同允许插入
mydb=# insert into t3 values('bb',11); ERROR: conflicting key value violates exclusion constraint "t3_name_age_excl" DETAIL: Key (name, age)=(bb, 11) conflicts with existing key (name, age)=(bb, 10). mydb=#
原文链接:https://blog.csdn.net/weixin_39540651/article/details/104022650