教程 > postgresql 教程 > 阅读:97

postgresql 约束——迹忆客-ag捕鱼王app官网

约束是对表上的数据列强制执行的规则。这些用于防止将无效数据输入到数据库中。这保证了数据库中数据的准确性和可靠性。

约束可以是列级或表级。列级约束仅应用于一列,而表级约束应用于整个表。为列定义数据类型本身就是一个约束。例如,类型为 date 的列将该列限制为有效日期。

以下是 postgresql 中可用的常用约束。

  • not null:指示某列不能存储 null 值。
  • unique:确保某列的值都是唯一的。
  • primary key:not null 和 unique 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。。
  • foreign key: 保证一个表中的数据匹配另一个表中的值的参照完整性。
  • check: 保证列中的值符合指定的条件。
  • exclusion :排他约束,保证如果将任何两行的指定列或表达式使用指定操作符进行比较,至少其中一个操作符比较将会返回 false 或空值。

not null 约束

默认情况下,列可以保存为 null 值。如果您不想某列有 null 值,那么需要在该列上定义此约束,指定在该列上不允许 null 值。

null 与没有数据是不一样的,它代表着未知的数据。

示例

下面示例创建了一张新表叫 company1,添加了 5 个字段,其中三个 id,name,age 设置不接受空置:

create table company1(
   id int primary key     not null,
   name           text    not null,
   age            int     not null,
   address        char(50),
   salary         real
);

unique 约束

unique 约束可以设置列是唯一的,避免同一列出现重复值。

示例

下面示例创建了一张新表叫 company3,添加了 5 个字段,其中 age 设置为 unique,因此你不能添加两条有相同年龄的记录:

create table company3(
   id int primary key     not null,
   name           text    not null,
   age            int     not null unique,
   address        char(50),
   salary         real    default 50000.00
);

primary key

在设计数据库时,primary key 非常重要。

primary key 称为主键,是数据表中每一条记录的唯一标识。

设置 unique 的列可能有多个,但是一张表只有一列可以设置 primary key。

我们可以使用主键来引用表中的行,也可以通过把主键设置为其他表的外键,来创建表之间的关系。

主键是非空约束和唯一约束的组合。

一个表只能有一个主键,它可以由一个或多个字段组成,当多个字段作为主键,它们被称为复合键。

如果一个表在任何字段上定义了一个主键,那么在这些字段上不能有两个记录具有相同的值。

示例

下面我们创建 comapny4 表,其中 id 作为主键:

create table company4(
   id int primary key     not null,
   name           text    not null,
   age            int     not null,
   address        char(50),
   salary         real
);

foreign key 约束

foreign key 即外键约束,指定列(或一组列)中的值必须匹配另一个表的某一行中出现的值。

通常一个表中的 foreign key 指向另一个表中的 unique key(唯一约束的键),即维护了两个相关表之间的引用完整性。

示例

下面示例创建了一张 company6 表,并添加了5个字段:

create table company6(
   id int primary key     not null,
   name           text    not null,
   age            int     not null,
   address        char(50),
   salary         real
);

下面示例创建一张 department1 表,并添加 3 个字段,emp_id 就是外键,参照 company6 的 id:

create table department1(
   id int primary key      not null,
   dept           char(50) not null,
   emp_id         int      references company6(id)
);

check 约束

check 约束保证列中的所有值满足某一条件,即对输入一条记录要进行检查。如果条件值为 false,则记录违反了约束,且不能输入到表。

示例

例如,下面示例建一个新的表 company5,增加了五列。在这里,我们为 salary 列添加 check,所以工资不能为零:

create table company5(
   id int primary key     not null,
   name           text    not null,
   age            int     not null,
   address        char(50),
   salary         real    check(salary > 0)
);

exclusion 约束

exclusion 约束确保如果使用指定的运算符在指定列或表达式上比较任意两行,至少其中一个运算符比较将返回 false 或 null。

示例

下面示例创建了一张 company7 表,添加 5 个字段,并且使用了 exclude 约束。

create table company7(
   id int primary key     not null,
   name           text,
   age            int  ,
   address        char(50),
   salary         real,
   exclude using gist
   (name with =,  -- 如果满足 name 相同,age 不相同则不允许插入,否则允许插入
   age with <>)   -- 其比较的结果是如果整个表边式返回 true,则不允许插入,否则允许
);

这里,using gist 是用于构建和执行的索引一种类型。

注意 - 您需要为每个数据库执行一次 create extension btree_gist 命令,这将安装 btree_gist 扩展,它定义了对纯标量数据类型的 exclude 约束。

由于我们已经强制执行了年龄必须相同,让我们通过向表插入记录来查看这一点:

insert into company7 values(1, 'paul', 32, 'california', 20000.00 );
insert into company7 values(2, 'paul', 32, 'texas', 20000.00 );  
-- 此条数据的 name 与第一条相同,且 age 与第一条也相同,故满足插入条件
insert into company7 values(3, 'allen', 42, 'california', 20000.00 );
-- 此数据与上面数据的 name 相同,但 age 不相同,故不允许插入

前面两条顺利添加的 company7 表中,但是第三条则会报错:

error:  duplicate key value violates unique constraint "company7_pkey"
detail:  key (id)=(3) already exists.

删除约束

删除约束必须知道约束名称,已经知道名称来删除约束很简单,如果不知道名称,则需要找到系统生成的名称,使用 \d 表名 可以找到这些信息。

通用语法如下:

alter table table_name drop constraint some_name;

查看笔记

扫码一下
查看教程更方便
网站地图