GaussDB 约束的使用举例
1 not null 约束
not null 约束强制列不接受 null 值。not null 约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。
GaussDB使用pg_get_tabledef()函数获取customers表结构,如:
csdn=> set search_path=csdn;
SET
csdn=>
csdn=> select * from pg_get_tabledef('customers');pg_get_tabledef
---------------------------------------------------------------------------SET search_path = csdn; +CREATE TABLE customers ( +id bigint NOT NULL, +name character varying(64), +addr character varying(128), +city character varying(64), +zip integer, +province character varying(64) NOT NULL, +age integer +) +WITH (orientation=row, compression=no, storage_type=USTORE, segment=off);
(1 row)
我们看到customers表的"客户ID"与"省份"具有not null属性,如果我们向表添加数据时就会触发not null约束。
示例:
insert into customers(id,name,addr) values(90,'test not null','布吉吉华54号');
结果:
2 unique 约束
unique 约束唯一标识数据库表中的每条记录。unique 和 primary key 约束均为列或列集合提供了唯一性的保证。primary key 约束拥有自动定义的 unique 约束。请注意,每个表可以有多个unique 约束,但是每个表只能有一个 primary key 约束。
示例:我们创建Order表,设置订单id列为unique属性
create table if not exists orders
(order_id bigint,cust_id bigint,empoyee_id int,order_date timestamp,ship_id bigint,constraint unq_order_id unique(order_id)
);
结果:
如果我们的写入orderid有重复值,就会报ERROR:Duplicate key value
注:unique列约束是允许写入null值的:
insert into orders(order_id,cust_id,empoyee_id,order_date,ship_id) values(null,3,9,'2018-09-21 09:00:00.000',3);
3 primary key 约束
以customers表为例,客户ID与客户名称组合列为主键。
create table customers
(id bigint,name varchar2(64),addr varchar2(128),city varchar2(64),zip varchar2(64),province varchar2(64),constraint prikey_id_name primary key(id,name)
);
结果:
写入数据,如果客户ID与客户名称同时存在2个相同数据时就会报错。
insert into customers(id,name,addr,city,zip,province) values(1,'张三','北京路27号','上海','200000','上海市');
insert into customers(id,name,addr,city,zip,province) values(1,'李四','南京路12号','杭州','310000','浙江市');
insert into customers(id,name,addr,city,zip,province) values(1,'张三','北京路27号','上海','200000','上海市');
如果为primary key约束,同时任何为primary key字段不允许为null值,这个是与unique约束的区别。以下客户名称为空时会报:The null value in column "name"
insert into customers(id,name,addr,city,zip,province) values(1,null,'北京路27号','上海','200000','上海市');
结果:
4 foreign key 约束
一个表中的 foreign key 指向另一个表中的 primary key。让我们通过一个实例来解释外键。请看下面两个表:
"customers" 表: "orders" 表:
请注意:"orders" 表中的 "客户id" 列指向 "customers" 表中的 "客户 id" 列。"customers" 表中的 "客户id" 列是 "customers" 表中的 primary key。"orders" 表中的 "客户 id" 列是 "orders" 表中的 foreign key。foreign key 约束用于预防破坏表之间连接的行为。foreign key 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
首先:创建客户表,主键为客户ID
create table customers
(id bigint,name varchar2(64),addr varchar2(128),city varchar2(64),zip varchar2(64),province varchar2(64),constraint prikey_id primary key(id)
);
再次:创建订单表,外键为客户ID
create table if not exists orders
(order_id bigint,cust_id bigint,empoyee_id int,order_date timestamp,ship_id bigint,constraint unq_order_id unique(order_id),foreign key (cust_id) references customers(id)
);
结果:
当我们向订单表写入一条订单,但是客户ID不在客户表的客户ID时会报错:ERROR: insert or update on table "orders" violates foreign key constraint
示例:
insert into customers(id,name,addr,city,zip,province) values(1,'张三','北京路27号','上海','200000','上海市');
向order表写入一条订单记录,如果客户ID不再customer表
insert into orders(order_id,cust_id,empoyee_id,order_date,ship_id) values(1,3,9,'2018-09-21 09:00:00.000',3);
由此,我们应知道外键的含义了,没有客户哪里有订单呢?必须是先有客户才有订单的。
5 default 约束
default 约束用于向列中插入默认值。如果没有规定其他的值,那么会将默认值添加到所有的新记录。
以下创建customers表省份为default约束:
alter table customers alter province set default '广东省';
结果:
写入时用default关键字:
insert into customers(id,name,addr,city,zip,province) values(2,'李四','南京路12号','杭州','310000',default);
结果:
6 check 约束
如果对单个列定义 check 约束,那么该列只允许特定的值。如果对一个表定义 check 约束,那么此约束会基于行中其他列的值在特定的列中对值进行限制。
如:对于客户来说需要符合法律年龄的中国人,那么年龄要大于或等于18岁,这个条件我们就可以设置check约束:
alter table customers add constraint check_age check(age>=18);
结果:
以上写入一位李四的客户年龄为16岁时报:violates check constraint
7 批注
以上六种约束是工作中经常使用到的,主要还是用来规范数据,随着数据量的增多,如果不对表结构加以约束,那么会有越来越多的“脏数据”进入到数据库,这对业务系统来说是非常不愿意碰到的。所以为了能够高效的使用数据库,请从表结构的设计上下更多的功夫.