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

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.xdnf.cn/news/16993.html

相关文章:

  • 机器人学中路径规划(Path Planning)和轨迹生成(Trajectory Generation)关系
  • 小智服务器Java安装编译(xinnan-tech)版
  • 麦肯锡咨询公司PEI经典面试题目汇总
  • gbase8s 常见表约束介绍
  • 18-C语言:第19天笔记
  • 知识随记-----Qt 实战教程:使用 QNetworkAccessManager 发送 HTTP POST
  • Ubuntu系统VScode实现opencv(c++)图像翻转和旋转
  • Java语言核心特性全解析:从面向对象到跨平台原理
  • 【学习笔记】Java并发编程的艺术——第1章 并发编程的挑战
  • 前端开发(HTML,CSS,VUE,JS)从入门到精通!第三天(JavaScript)
  • Maven - 并行安全无重复打包构建原理揭秘
  • sqli-labs通关笔记-第28a关GET字符注入(关键字过滤绕过 手注法)
  • 如何设置主机IP地址
  • 用纳米AI一键生成Python屏幕监控软件
  • Python编程基础与实践:Python循环结构基础
  • 【图像处理基石】用Python实现基础滤镜效果
  • QPainter::CompositionMode解析
  • 智能学号抽取系统V5.6.4重磅发布
  • MyBatis 批量操作 XML 实现方式
  • 大模型(五)MOSS-TTSD学习
  • Windows 环境 psql 客户端连接数据库超慢问题
  • Mac电脑安装HomeBrew
  • GitHub 趋势日报 (2025年08月01日)
  • 【转】大模型安全治理的现状与展望
  • 【Leetcode】2561. 重排水果
  • Paper Reading《TrafficFormer: An Efficient Pre-trained Model for Traffic Data》
  • 【Leetcode hot 100】49.字母异位词分组
  • Windows中使用Qwen模型:VSCode+Cline
  • ABP VNext + NATS JetStream:高性能事件流处理
  • 【智能体cooragent】不同的单智能体调用的大模型的推理的输入与输出