openGauss学习笔记-26 openGauss 高级数据管理-约束

文章目录

    • openGauss学习笔记-26 openGauss 高级数据管理-约束
      • 26.1 NOT NULL约束
      • 26.2 UNIQUE约束
      • 26.3 PRIMARY KEY
      • 26.4 FOREIGN KEY
      • 26.5 CHECK约束

openGauss学习笔记-26 openGauss 高级数据管理-约束

约束子句用于声明约束,新行或者更新的行必须满足这些约束才能成功插入或更新。如果存在违反约束的数据行为,行为会被约束终止。

约束可以在创建表时规定(通过 CREATE TABLE 语句),或者在表创建之后规定(通过 ALTER TABLE 语句)。

约束可以是列级或表级。列级约束仅适用于列,表级约束被应用到整个表。

openGauss中常用的约束如下:

  • NOT NULL:指示某列不能存储NULL值。
  • UNIQUE:确保某列的值都是唯一的。
  • PRIMARY KEY:NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
  • FOREIGN KEY: 保证一个表中的数据匹配另一个表中的值的参照完整性。
  • CHECK: 保证列中的值符合指定的条件。

26.1 NOT NULL约束

创建表时,如果不指定约束,默认值为NULL,即允许列插入空值。如果您不想某列存在NULL值,那么需要在该列上定义NOT NULL约束,指定在该列上的值不允许存在NULL值。插入数据时,如果该列存在NULL值,则会报错,插入失败。

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

例如,创建表staff,共有5个字段,其中NAME,ID设置不接受空值。

openGauss=# CREATE TABLE staff(ID             INT      NOT NULL,NAME           char(8)    NOT NULL,AGE            INT     ,ADDRESS        CHAR(50),SALARY         REAL
);

给表staff插入数据。当ID字段插入空值时,数据库返回报错。

openGauss=# INSERT INTO staff  VALUES (1,'lily',28);
INSERT 0 1
openGauss=# INSERT INTO staff (NAME,AGE) VALUES ('JUCE',28);
ERROR:  null value in column "id" violates not-null constraint
DETAIL:  Failing row contains (null, JUCE    , 28, null, null).

26.2 UNIQUE约束

UNIQUE约束表示表里的一个字段或多个字段的组合必须在全表范围内唯一。

对于唯一约束,NULL被认为是互不相等的。

例如,创建表staff1,表包含5个字段,其中AGE设置为UNIQUE,因此不能添加两条有相同年龄的记录。

openGauss=# CREATE TABLE staff1(ID             INT      NOT NULL,NAME           char(8)    NOT NULL,AGE            INT   NOT NULL  UNIQUE  ,ADDRESS        CHAR(50),SALARY         REAL
);

给表staff1表插入数据。当字段AGE插入两条一样的数据时,数据库返回报错。

openGauss=# INSERT INTO staff1  VALUES (1,'lily',28);
INSERT 0 1
openGauss=# INSERT INTO staff1 VALUES (2, 'JUCE',28);
ERROR:  duplicate key value violates unique constraint "staff1_age_key"
DETAIL:  Key (age)=(28) already exists.

26.3 PRIMARY KEY

PRIMARY KEY为主键,是数据表中每一条记录的唯一标识。主键约束声明表中的一个或者多个字段只能包含唯一的非NULL值。

主键是非空约束和唯一约束的组合。一个表只能声明一个主键。

例如,创建表staff2,其中ID为主键。

openGauss=# CREATE TABLE staff2(ID             INT     PRIMARY KEY     ,NAME           TEXT    NOT NULL,AGE            INT     NOT NULL,ADDRESS        CHAR(50),SALARY         REAL
);
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "staff2_pkey" for table "staff2"
CREATE TABLE

26.4 FOREIGN KEY

FOREIGN KEY即外键约束,指定列(或一组列)中的值必须匹配另一个表的某一行中出现的值。通常一个表中的FOREIGN KEY指向另一个表中的 UNIQUE KEY(唯一约束的键),即维护了两个相关表之间的引用完整性。

例如,创建表staff3,包含5个字段。

openGauss=# CREATE TABLE staff3(ID             INT    PRIMARY KEY  NOT NULL,NAME           TEXT    NOT NULL,AGE            INT     NOT NULL,ADDRESS        CHAR(50),SALARY         REAL
);

创建一张DEPARTMENT表,并添加3个字段,其中EMP_ID为外键,参照staff3的ID字段:

openGauss=# CREATE TABLE DEPARTMENT(ID INT PRIMARY KEY      NOT NULL,DEPT           CHAR(50) NOT NULL,EMP_ID         INT      references staff3(ID)
);

FOREIGN Key在MySQL兼容性下,外键可以关联非唯一性索引。即一个表中的FOREIGN Key指向另一个表中的 Non-unique KEY(非唯一约束的键)。 注: 如果在MySQL兼容性下,定义外键指定ON UPDATE | DELETE CASCADE时,在非唯一性索引中,非唯一索引字段存在多个元组时,只要dml其中一行数据,则会触发外键表里关联的字段全部修改。但如果字段为NULL时,则不触发外键关联的字段做对应的修改。

MySQL兼容性需要安装dolphin插件才可生效。

openGauss=# create table t1(id int, name varchar);
CREATE TABLE
openGauss=# create table t2(id int, a_id int);
CREATE TABLE
-- create non-unique index on table t1.
openGauss=# create index a_index_1 on t1(id);
CREATE INDEX
-- create foreign key on non-unique index
openGauss=# alter table t2 add constraint t2_fk foreign key (a_id) references t1(id);
ALTER TABLE
openGauss=# \d t1Table "public.t1"Column |       Type        | Modifiers 
--------+-------------------+-----------id     | integer           | name   | character varying | 
Indexes:"a_index_1" btree (id) TABLESPACE pg_default
Referenced by:TABLE "t2" CONSTRAINT "t2_fk" FOREIGN KEY (a_id) REFERENCES t1(id)openGauss=# \d t2Table "public.t2"Column |  Type   | Modifiers 
--------+---------+-----------id     | integer | a_id   | integer | 
Foreign-key constraints:"t2_fk" FOREIGN KEY (a_id) REFERENCES t1(id)openGauss=# insert into t1 values(1,'a'),(2,'b');
INSERT 0 2
openGauss=# select * from t1;id | name 
----+------1 | a2 | b
(2 rows)openGauss=# insert into t2 values(1,1);
INSERT 0 1
openGauss=# select * from t2;id | a_id 
----+------1 |    1
(1 row)openGauss=# insert into t2 values(1,3);
INSERT 0 1
ERROR:  insert or update on table "t2" violates foreign key constraint "t2_fk"
DETAIL:  Key (a_id)=(3) is not present in table "t1".
openGauss=# select * from t2;id | a_id 
----+------1 |    1
(1 row)openGauss=# alter table t2 drop constraint t2_fk;
ALTER TABLE
openGauss=# alter table t2 add constraint t2_fk foreign key (a_id) references t1(id) on update cascade;
ALTER TABLE
openGauss=# select * from t1;id | name 
----+------1 | a2 | b
(2 rows)openGauss=# insert into t1 values(1,'s');
INSERT 0 1
openGauss=# select * from t1;id | name 
----+------1 | a2 | b1 | s
(3 rows)openGauss=# insert into t2 values(2,1);
INSERT 0 1
openGauss=# select * from t2;id | a_id 
----+------1 |    12 |    1
(2 rows)openGauss=# update t1 set id = 11 where name = 'a';
UPDATE 1
openGauss=# select * from t1;id | name 
----+------2 | b1 | s11 | a
(3 rows)openGauss=# select * from t2;id | a_id 
----+------1 |   112 |   11
(2 rows)openGauss=# update t1 set id =1 where name = 'a';
UPDATE 1
openGauss=# alter table t2 drop constraint t2_fk;
ALTER TABLE
openGauss=# alter table t2 add constraint t2_fk foreign key (a_id) references t1(id) on delete cascade;
ALTER TABLE
openGauss=# select * from t1;id | name 
----+------2 | b1 | s1 | a
(3 rows)openGauss=# select * from t2;id | a_id 
----+------1 |    12 |    1
(2 rows)openGauss=# delete from t1 where name = 's';
DELETE 1
openGauss=# select * from t1;id | name 
----+------2 | b1 | a
(2 rows)openGauss=# select * from t2;id | a_id 
----+------
(0 rows)

26.5 CHECK约束

CHECK约束声明一个布尔表达式,每次要插入的新行或者要更新的行的新值必须使表达式结果为真或未知才能成功,否则会抛出一个异常并且不会修改数据库。

声明为字段约束的检查约束应该只引用该字段的数值,而在表约束里出现的表达式可以引用多个字段。expression表达式中,如果存在“<>NULL”或“!=NULL”,这种写法是无效的,需要写成“is NOT NULL”。

例如,创建表staff4,对字段SALARY新增CHECK约束,确保插入此列数值大于0。

openGauss=# CREATE TABLE staff4(ID INT PRIMARY KEY     NOT NULL,NAME           TEXT    NOT NULL,AGE            INT     NOT NULL,ADDRESS        CHAR(50),SALARY         REAL    CHECK(SALARY > 0)
);
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "staff4_pkey" for table "staff4"
CREATE TABLE

给表staff4插入数据。当字段SALARY插入数据不大于0时,数据库返回报错。

openGauss=# INSERT INTO staff4(ID,NAME,AGE,SALARY) VALUES (2, 'JUCE',16,0);
ERROR:  new row for relation "staff4" violates check constraint "staff4_salary_check"
DETAIL:  N/A

👍 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富!

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/15759.shtml

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

相关文章

基于SHARC+®单核的ADSP-21567KBCZ6、ADSP-21566BBCZ4、ADSP-21566KBCZ4高性能DSP处理器产品

ADSP-2156x 处理器的速度高达 1 GHz&#xff0c;属于 SHARC 系列产品。ADSP-2156x 处理器基于 SHARC 单核。ADSP-2156x SHARC 处理器是 SIMD SHARC 系列数字信号处理器 (DSP) 中的一款产品&#xff0c;采用 ADI 的超级哈佛架构。这些 32 位/40 位/64 位浮点处理器已针对高性能音…

Rust vs Go:常用语法对比(九)

题图来自 Golang vs Rust - The Race to Better and Ultimate Programming Language 161. Multiply all the elements of a list Multiply all the elements of the list elements by a constant c 将list中的每个元素都乘以一个数 package mainimport ( "fmt")func …

Android Unit Test

一、测试基础知识 1.1 测试级别 测试金字塔&#xff08;如图 2 所示&#xff09;说明了应用应如何包含三类测试&#xff08;即小型、中型和大型测试&#xff09;&#xff1a; 小型测试是指单元测试&#xff0c;用于验证应用的行为&#xff0c;一次验证一个类。 中型测试是指…

创造自己的宠物医院预约服务小程序,步骤详解

在现代社会&#xff0c;越来越多的人开始养宠物&#xff0c;而宠物的健康管理也成为了一个重要的话题。为了方便宠物主人随时随地进行宠物医院的管理和服务&#xff0c;开发一个宠物医院管理小程序是很有必要的。今天我们将分享一些制作宠物医院管理小程序的技巧&#xff0c;帮…

解决IDEA配置.gitignore不生效的问题

问题&#xff1a; 代码已经提交过&#xff0c;修改.gitignore文件&#xff0c;再次提交&#xff0c;发现没生效。 原因 .gitignore只能忽略未被track的文件&#xff0c;而git本地缓存。如果某些文件已经被纳入了版本管理中&#xff0c;则修改.gitignore是无效的。 解决方法…

Flutter系列文章-Flutter进阶2

这一节我将再详细地为您介绍 Flutter 进阶主题&#xff0c;包括导航和路由、状态管理、异步处理、HTTP请求和Rest API&#xff0c;以及数据持久化。让我们逐个介绍这些主题。 1.导航和路由 在 Flutter 中&#xff0c;导航和路由是构建多页面应用的关键概念。导航是指从一个页…

uniappAPP和webview互相通讯,webview调用APP原生方法

因为公司开发的公司内部APP功能没有太多涉及到原生方法&#xff0c;加上功能迭代太快&#xff0c;如果一直更新APP导致体验不好&#xff0c;所以决定所有页面都用webview来做&#xff0c;APP就一个壳子&#xff0c;里面所有页面都在外面&#xff0c;这里就有一个APP和webview通…

collect2: fatal error: ld terminated with signal 9 [Killed]

在 WSL2 中编译 LLVM遇到了如下报错&#xff1a; collect2: fatal error: ld terminated with signal 9 [Killed] 经过查询&#xff0c;发现是因为内存不足&#xff0c;造成进程被killed。 默认WSL2 的内存是主机内存的50%或者8GB。因此提高内存上限即可。如果主机内存有限&am…

缓存穿透、缓存雪蹦、缓存击穿记录

缓存穿透&#xff1a; 多个恶意并发请求不存在的数据&#xff0c;缓存中没有&#xff0c;导致多个请求进入到数据库&#xff0c;数据库中查询null&#xff0c;没有返回数据到缓存中&#xff0c;导致一直有大量请求到数据库中。数据库压力过大&#xff0c;这种情况叫做缓存击穿。…

Vue没有node_modules怎么办

npm install 一下 然后再npm run serve 就可以运行了

基于多任务学习卷积神经网络的皮肤损伤联合分割与分类

文章目录 Joint segmentation and classification of skin lesions via a multi-task learning convolutional neural network摘要本文方法实验结果 Joint segmentation and classification of skin lesions via a multi-task learning convolutional neural network 摘要 在…

CVPR2023新作:3D感知的AI换脸算法

Title: 3D-Aware Face Swapping (3D感知的人脸交换) Affiliation: 上海交通大学人工智能研究所 Authors: Yixuan Li, Chao Ma, Yichao Yan, Wenhan Zhu, Xiaokang Yang Keywords: Face swapping, 3D human faces, Generative Adversarial Network, geometry Summary: (1):…

Python实现GA遗传算法优化BP神经网络分类模型(BP神经网络分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 遗传算法&#xff08;Genetic Algorithm&#xff0c;GA&#xff09;最早是由美国的 John holland于20世…

青龙面板的安装和使用

玩nas除了看看电影&#xff0c;那肯定还得玩转docker&#xff0c;这期讲的就是青龙面板&#xff0c;一个跑脚本的神器。 GitHub地址&#xff1a;青龙面板 1.安装 你安装完docker那就很简单了&#xff0c;不懂可以看看我这篇博客docker安装 镜像源一定要搞&#xff0c;要不然…

vue params传参刷新网页数据丢失解决方法

这里有一段代码&#xff0c;我想让它刷新网页数据不会丢失的同时&#xff0c;还不希望数据显示在url地址里。 发送数据页面Q: this.$router.push({name:A,params:{val:JSON.stringify(val)}})接收数据页面A: val:JSON.parse(this.$route.params.val)这时刷新页面A&#xff0c;…

bigemap工程工程行业应用

客户目前主要是需求为使用下载卫星图、等高线、水系、路网等等元素数据做线路规划图 其他信息 客户需要的图中还包含一些农作物以及需要在软件上标注带有箭头的线段&#xff08;不能满足&#xff09; 如下图&#xff1a; 使用场景&#xff1a; 目前主要为制图、规划线路等等…

1.1.2 SpringCloud 版本问题

目录 版本标识 版本类型 查看对应版本 版本兼容的权威——官网&#xff1a; 具体的版本匹配支持信息可以查看 总结 在将Spring Cloud集成到Spring Boot项目中时&#xff0c;确保选择正确的Spring Cloud版本和兼容性是非常重要的。由于Spring Cloud存在多个版本&#xff0c;因此…

力扣 509. 斐波那契数

题目来源&#xff1a;https://leetcode.cn/problems/fibonacci-number/description/ C题解1&#xff1a;根据题意&#xff0c;直接用递归函数。 class Solution { public:int fib(int n) {if(n 0) return 0;else if(n 1) return 1;else return(fib(n-1) fib(n-2));} }; C题…

socket 基础

Socket是什么呢&#xff1f; ① Socket通常也称作“套接字”&#xff0c;用于描述IP地址和端口&#xff0c;是一个通信链的句柄。应用程序通常通过“套接字”向网络发出请求或者应答网络请求。 ② Socket是连接运行在网络上的两个程序间的双向通信的端点。 ③ 网络通讯其实指…

第九十三回 在Flutter中mock数据

文章目录 概念介绍使用方法示例代码 我们在上一章回中介绍了"在Flutter中解析JSON数据"相关的内容&#xff0c;本章回中将介绍 如何mock数据.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们在本章回中介绍的mock数据主要是通过相关的代码模拟服务器…