ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

postgresql 约束

2022-06-21 11:34:50  阅读:164  来源: 互联网

标签:postgresql name age 约束 products mydb 主键


约束

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

标签:postgresql,name,age,约束,products,mydb,主键
来源: https://www.cnblogs.com/nanblog/p/16396215.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有