postgresql 中的约束

约束

pg中的约束有以下几种:

  • 检查约束
  • 非空约束
  • 唯一约束
  • 主键
  • 外键

检查约束

最常见的类型,使用该约束后,在设置某个字段里的数值时必须使这个 约束的表达式的值为真。比如,限制一个人的年龄在0-150之间。

1
create table person (name varchar(40),age int check(age >=0 and age <=150),sex boolean);

也可给约束添加一个名字:

1
create table person (name varchar(40),age int constraint check_age check(age >=0 and age <=150),sex boolean);

删除约束:

1
alter table person drop constraint check_age;

重命名约束:

1
alter table person rename constraint check_age to person_age_check;

这是利用sql语句操作约束,对于我们常见的orm框架sqlalchemy应该使用CheckConstraint来添加check类型的约束。

1
2
3
4
5
6
7
8
from sqlalchemy import CheckConstraint
class Person(db.Model):
id = db.Column(db.Integer,primary_key=True)
name = db.Column(db.String)
age = db.Column(db.Integer,CheckConstraint('age>=0 and age<=150','check_age'))
sex = db.Column(db.Boolean)

这样我们在初始化数据结构的时候就会自动添加上对age字段的约束了。

前边两个是字段约束,我们可以在表上创建个一个约束,根据某几个字段进行约束。

语法是:

1
2
3
4
5
create table books (no integer,name varchar,price numeric,discount_price numeric, check(price>discount_price));
insert into books values (1,'test',10,12);
ERROR: new row for relation "books" violates check constraint "books_check"
DETAIL: Failing row contains (1, test, 10, 12).

sqlalchemy中创建表级约束的方式是:

1
2
3
4
5
6
7
8
9
10
11
12
from app import db
from sqlalchemy import CheckConstraint
class Person(db.Model):
id = db.Column(db.Integer,primary_key=True)
name = db.Column(db.String)
age = db.Column(db.Integer)
adult_age = db.Column(db.Integer)
sex = db.Column(db.Boolean)
CheckConstraint(age>adult_age)

非空约束

非空约束只是简单地声明一个字段必须不能为NULL。

1
create table books (book_no integer not null,name varchar,price numeric);

一个非空约朿总是被写成一个字段约束。非空约束在功能上等效于创建一个检査约束:

1
CHECK (column_name IS NOT NULL)

但很明显,创建一个明确的非空约束要更直观一些 。

唯一约束

唯一约束保证在一个字段或一组字段里的数据相较于表中其他行的数据是唯一的。它的语法是:

1
create table books (book_no integer unique,name varchar,price numeric);

外键约束

外键约束是表之间关系的一种约束,用于约束本表中一个字段或多个字段的数值必须出现在一个表的一个字段或多个字段中。这种约束也可以称为两个相关表之间的参照完整性约束。

如“学生表”与“班级表”之间的关系,一个学生一定是某个班级的学生:

1
2
3
CREATE TABLE class(class_no int primary key, class_name varchar(40));
CREATE TABLE student( student_no int primary key, student_name varchar(40), age int, class no int REFERENCES class(class_no);