当前位置: 首页 > news >正文

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  批注

 
以上六种约束是工作中经常使用到的,主要还是用来规范数据,随着数据量的增多,如果不对表结构加以约束,那么会有越来越多的“脏数据”进入到数据库,这对业务系统来说是非常不愿意碰到的。所以为了能够高效的使用数据库,请从表结构的设计上下更多的功夫.

http://www.dtcms.com/a/311124.html

相关文章:

  • Leetcode-141.环形链表
  • Rust: 工具链版本更新
  • Linux网络-------4.传输层协议UDP/TCP-----原理
  • Ajax——异步前后端交互提升OA系统性能体验
  • python chardet文本编码识别代码
  • Java单元测试和设计模式
  • uniapp 富文本rich-text 文本首行缩进和图片居中
  • Day 29: 复习
  • 音视频学习(四十五):声音的产生
  • 数据集-目标检测系列- 地球仪 数据集 globe>> DataBall
  • 前端应用权限设计面面观
  • 网络基础实操篇-05-路由基础-最佳实践
  • 【机器学习】非线性分类算法(上):KNN(基于距离相似度)与朴素(特征独立)贝叶斯(基于概率统计)
  • MybatisPlus-逻辑删除
  • 【ElementPlus】深入探索ElementPlus:前端界面的全能组件库
  • 【Conda】配置Conda镜像源
  • 【Linux】vim—基操
  • 网易云音乐硬刚腾讯系!起诉SM娱乐滥用市场支配地位
  • 【深度学习②】| DNN篇
  • SmartCLIP:具有识别保证的模块化视觉-语言对齐
  • 基于OAuth2与JWT的微服务API安全实战经验分享
  • Java 垃圾回收机制:自动化内存管理的艺术与科学
  • Python 程序设计讲义(54):Python 的函数——函数概述
  • Linux iptables防火墙操作
  • 一种基于入侵杂草优化算法(IWO)的聚类算法,并与K-Means、高斯混合模型(GMM)进行对比,Matlab
  • 网安-中间件(updating..)
  • HarmonyOS NEXT系列之定制化构建制品
  • HarmonyOS 开发:基于 ArkUI 实现复杂表单验证的最佳实践
  • 电子电气架构 --- 汽车网络安全概述
  • lumerical——布拉格光栅(2)