05_PostgreSQL 约束

本文介绍了PostgreSQL数据库中的约束,包括常用类型、实例演示如何创建约束,以及如何通过查询获取表的约束信息,并进行了约束功能的实战测试。

PostgreSQL约束

常用约束介绍

约束名描述
NOT NULL字段值不能存储NULL
UNIQUE字段值都是唯一的
CHECK字段值需符合指定的条件
DEFAULT字段默认值
PRIMARY KEY主键约束(UNIQUE + NOT NULL)
FOREIGN KEY外键约束(一个表中的数据匹配另一个表中的值的参照完整性)
EXCLUSION排他约束(如果将任何两行的指定列或表达式使用指定操作符进行比较,至少其中一个操作符比较将会返回 false 或空值。)

示例

CREATE TABLE employee(
	id SERIAL PRIMARY KEY,
	name VARCHAR(255) NOT NULL,
	birthdate timestamp NOT NULL,
	info TEXT,
	salary REAL CHECK(salary > 2000),
	is_staff boolean DEFAULT True NOT NULL,
	is_delete boolean DEFAULT False NOT NULL,
	create_time timestamp DEFAULT CURRENT_TIMESTAMP
);

查看表信息

>\d employee
                                                   Table "public.employee"
   Column    |            Type             | Collation | Nullable |                          Default            
              
-------------+-----------------------------+-----------+----------+---------------------------------------------
--------------
 id          | integer                     |           | not null | nextval('employee_id_seq'::regclass)
 name        | character varying(255)      |           | not null | 
 birthdate   | timestamp without time zone |           | not null | 
 info        | text                        |           |          | 
 salary      | real                        |           |          | 
 is_staff    | boolean                     |           | not null | true
 is_delete   | boolean                     |           | not null | false
 create_time | timestamp without time zone |           |          | '2019-08-29 14:22:06.446794'::timestamp with
out time zone
Indexes:
    "employee_pkey" PRIMARY KEY, btree (id)
Check constraints:
    "employee_salary_check" CHECK (salary > 2000::double precision)

约束测试

> INSERT INTO employee (name, birthdate, salary) values('王一', now(), 2500);
INSERT 0 1
> INSERT INTO employee (name, birthdate, salary) values('赵四', now(), 1800);
ERROR:  new row for relation "employee" violates check constraint "employee_salary_check"
DETAIL:  Failing row contains (2, 赵四, 2019-08-29 15:21:11.911674, null, 1800, t, f, 2019-08-29 14:22:06.446794).
> INSERT INTO employee (name, birthdate, salary) values('赵四', now(), 3000);
INSERT 0 1
> select * from employee;
 id | name |         birthdate          | info | salary | is_staff | is_delete |        create_time         
----+------+----------------------------+------+--------+----------+-----------+----------------------------
  1 | 王一 | 2019-08-29 15:20:43.819572 |      |   2500 | t        | f         | 2019-08-29 15:31:40.29647
  3 | 赵四 | 2019-08-29 15:32:04.320762 |      |   3000 | t        | f         | 2019-08-29 15:32:04.320762
(2 rows)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值