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.pswp.cn/diannao/94161.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/94161.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自动驾驶中的传感器技术13——Camera(4)

1、自驾Camera开发的方案是否归一化对于OEM,或者自驾方案商如Mobileye如果进行Camera的开发,一般建议采用Tesla的系统化最优方案,所有Camera统一某个或者某两个MP设计(增加CIS议价权,减少Camera PCBA的设计维护数量&am…

开源利器:glTF Compressor——高效优化3D模型的终极工具

在3D图形开发领域,glTF(GL Transmission Format)已成为Web和移动端3D内容的通用标准。然而,3D模型的文件体积和纹理质量往往面临权衡难题。Shopify最新开源的glTF Compressor工具,为开发者提供了一套精细化、自动化的解决方案,让3D模型优化既高效又精准。本文将深入解析这…

LeetCode Hot 100,快速学习,不断更

工作做多了有时候需要回归本心,认真刷题记忆一下算法。那就用我这练习时长两年半的代码农民工来尝试着快速解析LeetCode 100吧 快速解析 哈希 1. 两数之和 - 力扣(LeetCode) 这题很简单啊,思路也很多 1. 暴力搜索,…

MySQL的子查询:

目录 子查询的相关概念: 子查询的分类: 角度1: 单行子查询: 单行比较操作符: 子查询的空值情况: 多行子查询: 多行比较操作符: ANY和ALL的区别: 子查询为空值的…

Python批处理深度解析:构建高效大规模数据处理系统

引言:批处理的现代价值在大数据时代,批处理(Batch Processing) 作为数据处理的核心范式,正经历着复兴。尽管实时流处理备受关注,但批处理在数据仓库构建、历史数据分析、报表生成等场景中仍不可替代。Pytho…

是德科技的BenchVue和纳米软件的ATECLOUD有哪些区别?

是德科技的BenchVue和纳米软件的ATECLOUD虽然都是针对仪器仪表测试的软件,但是在功能设计、测试场景、技术架构等方面有着明显的差异。BenchVue(是德科技)由全球领先的测试测量设备供应商开发,专注于高端仪器控制与数据分析&#…

线上redis的使用

一.String1.缓存玩家单个数据,但是我觉得还是用hash好2.结合过期时间,比如:某个东西结算了,redis记录一下,并设置过期时间3.分布式锁二.Hash1.缓存一个单位的数据,比如:联盟信息2.被封禁的列表,…

【实践记录】github仓库的更新

首先登录,参考:记一次github连接本地git_如何连接github-CSDN博客 SSH: git config --global user.name "GitHubUsername" git config --global user.email "emailexample.com" ssh-keygen -t ed25519 -C "emailex…

Nature图形复现—Graphpad绘制带P值的含数据点的小提琴图

带 P 值的含数据点的小提琴图是一种科研数据可视化图表,它同时呈现数据的分布特征、原始观测值和统计显著性:通过小提琴形状展示概率密度分布(反映数据集中趋势和离散程度),叠加抖动散点显示所有原始数据点&#xff08…

mongodb源代码分析createCollection命令由create.idl变成create_gen.cpp过程

mongodb命令db.createCollection(name, options)创建一个新集合。由于 MongoDB 在命令中首次引用集合时会隐式创建集合,因此此方法主要用于创建使用特定选项的新集合。例如,您使用db.createCollection()创建:固定大小集合;集群化集…

达梦(DM8)常用管理SQL命令(3)

达梦(DM8)常用管理SQL命令(3) 1.表空间 -- 查看表空间信息 SQL> SELECT * FROM v$tablespace;-- 查看数据文件 SQL> SELECT * FROM v$datafile;-- 表空间使用情况 SQL> SELECT df.tablespace_name "表空间名称",df.bytes/1024/1024 "总大小(MB)&q…

【Django】-5- ORM的其他用法

一、🚀 ORM 新增数据魔法!核心目标教你用 Django ORM 给数据库 新增数据 !就像给数据库 “生小数据宝宝”👶方法 1:实例化 Model save(一步步喂数据)obj Feedback() # 实例化 obj.quality d…

Flink Checkpoint机制:大数据流处理的坚固护盾

引言在大数据技术蓬勃发展的当下,数据处理框架层出不穷,Flink 凭借其卓越的流批一体化处理能力,在大数据流处理领域占据了举足轻重的地位 。它以高吞吐量、低延迟和精准的一次性语义等特性,成为众多企业处理实时数据的首选工具。在…

【STM32-HAL】 SPI通信与Flash数据写入实战

文章目录1.参考教程2. 4种时间模式3. 3个编程接口3.1 HAL_StatusTypeDef HAL_SPI_Transmit(...) :3.1.1 参数说明3.1.2 例子3.2 HAL_StatusTypeDef HAL_SPI_Receive(...) :3.2.1参数说明3.2.2 例子3.3 HAL_StatusTypeDef HAL_SPI_TransmitReceive(...) &…

SNR-Aware Low-light Image Enhancement 论文阅读

信噪比感知的低光照图像增强 摘要 本文提出了一种新的低光照图像增强解决方案,通过联合利用信噪比(SNR)感知的变换器(transformer)和卷积模型,以空间变化的操作方式动态增强像素。对于极低信噪比&#xff0…

在 Vue3 中使用 Mammoth.js(在 Web 应用中预览 Word 文档)的详解、常见场景、常见问题及最佳解决方案的综合指南

一、Mammoth.js 简介与核心功能 Mammoth.js 是一个专用于将 .docx 文档转换为 HTML 的库,适用于在 Web 应用中预览 Word 文档。其核心特点包括: 语义化转换:基于文档样式(如标题、段落)生成简洁的 HTML 结构,忽略复杂样式(如居中、首行缩进)。 轻量高效:适用于需要快…

2025 年 VSCode 插件离线下载硬核攻略

微软 2025 年起关闭 VSCode 官方市场 .vsix 文件直接下载入口,给企业内网开发者带来极大不便。不过别担心,今天提供一个下载.vsix文件地址。 VSC插件下载 (dreamsoul.cn) 下载好的.vsix文件后,打开vscode的应用,选择右上角...打开&#xff…

[leetcode] 位运算

位运算这类题目奇思妙招很多,优化方法更是非常考验经验积累。 常用小技能: bit_count():返回整数的二进制表示中1的个数,e.g. x 7 x.bit_count() # 32.bit_length():返回整数的二进制表示的长度,e.g. …

关于assert()函数,eval()函数,include

一.assert()函数例子assert("strpos($file, ..) false") or die("Detected hacking attempt!");assert("file_exists($file)") or die("That file doesnt exist!");第一个是会检验$file是否有.. ,如果有strpos会返回true&…

ICT模拟零件测试方法--电位器测试

ICT模拟零件测试方法–电位器测试 文章目录ICT模拟零件测试方法--电位器测试电位器测试电位器测试配置电位器测试配置电位器测试注意事项电位器测量选项电位器测试 电位器测试测量从 0.1 欧姆到 10M 欧姆的电阻。 本节介绍: 电位器测试配置电位器测试注意事项电位…