约束的笔记

约束的分类

为什么需要约束

为了保证数据的完整性

实体完整性(Entity Integrity)(同一个表中,不能存在两条完全相同无法区分的记录)

域完整性(Domain Integrity) 

引用完整性(Referential Integrity

用户自定义完整性(User-defined Integrity

什么是约束

约束是表级的强制规定。 (对表中字段的限制

如何添加/删除约束

create table 时添加约束

alter table 时添加约束,删除约束

约束的分类

①根据约束数据列的限制,约束可分为:

                       单列约束:每个约束只约束一列

                       多列约束:每个约束可约束多列数据

②根据约束的作用范围,约束可分为:

                       列级约束:只能作用在一个列上,跟在列的定义后面将此约束声明在对应字段的后面

                       表级约束:可以作用在多个列上,不与列一起,而是单独定义(在表中所有字段都声明完,在所有字段后面声明的约束

③根据约束起的作用,约束可分为:

                   NOT NULL 非空约束,规定某个字段不能为空

                   UNIQUE 唯一约束规定某个字段在整个表中是唯一的

                   PRIMARY KEY 主键(非空且唯一)约束

                   FOREIGN KEY 外键约束

                   CHECK 检查约束

                   DEFAULT 默认值约束

非空约束的使用

查看表的约束

SELECT * FROM information_schema.table_constraints

WHERE table_name = '表名称';

作用

限定某个字段/某列的值不允许为空

特点 ------------------------只能使用列级约束,将此约束声明在对应字段的后面

默认,所有的类型的值都可以是NULL,包括INTFLOAT等数据类型

非空约束只能出现在表对象的列上,只能某个列单独限定非空,不能组合非空

一个表可以有很多列都分别限定了非空

空字符串''不等于NULL0也不等于NULL

#在创建表时添加约束

CREATE TABLE test1(

id INT NOT NULL,

last_name VARCHAR(15) NOT NULL,

email VARCHAR(25),

salary DOUBLE(10,2)

);

注意点:

约束不为null的字段不能添加为null的数据

约束不为null的字段也不能修改为null

alter table 时添加约束,删除约束

修改时要检查该字段是否有为null的数据,如果有要修改以后才能添加约束成功

唯一性约束的使用

作用

用来限制某个字段/某列的值不能重复。

唯一约束允许出现多个空值null

3 特点

同一个表可以有多个唯一约束。

②唯一约束可以是某一个列的值唯一,也可以多个列组合的值唯一。

唯一性约束允许列值为空。(而且可以多次添加null)

在创建唯一约束的时候,如果不给唯一约束命名,就默认和列名相同。

MySQL会给唯一约束的列上默认创建一个唯一索引。

添加唯一约束

①在建表时:

列级约束:

create table 表名称(

字段名 数据类型,

字段名 数据类型 unique,

字段名 数据类型 unique key,

字段名 数据类型

);

表级约束:(上一个字段类型后要加逗号)

create table 表名称(

字段名 数据类型,

字段名 数据类型,

字段名 数据类型,

[constraint 约束名] unique key(字段名)

);

举例:

CREATE TABLE test2(

id INT UNIQUE,#列级约束

last_name VARCHAR(15),

email VARCHAR(25) UNIQUE,

salary DOUBLE(10,2),

#表级约束

CONSTRAINT uk_test2_email UNIQUE(email)#uk_test2_email为约束的名字

);

                                                                                                    

#可以向声明为unique的字段添加null。而且可以多次添加null值

INSERT INTO test2(id,last_name,email,salary)

VALUES(2,'Tom1',NULL,4500);



INSERT INTO test2(id,last_name,email,salary)

VALUES(3,'Tom2',NULL,4500);



#updata修改也不能修改为相同的。

②在alter table时添加约束

#字段列表中如果是一个字段,表示该列的值唯一。如果是两个或更多个字段,那么复合唯一,即多个字段的组合是唯一的

#方式1:-------------------------ADD

alter table 表名称 add unique key(字段列表);

#方式2:-------------------------MODIFY

alter table 表名称 modify 字段名 字段类型 unique;

关于复合唯一约束

create table 表名称(

字段名 数据类型,

字段名 数据类型,

字段名 数据类型,

unique key(字段列表) #字段列表中写的是多个字段名,多个字段名用逗号分隔,表示那么是复合唯一,即多个字段的组合是唯一的 );

举例:

#复合的唯一性约束(多个字段放一起约束,用表约束的方式)

CREATE TABLE USER(

id INT,

`name` VARCHAR(15),

`password` VARCHAR(25),

#表级约束(name与password结合的唯一性约束)

CONSTRAINT uk_user_name_pwd UNIQUE(`name`,`password`)

);



#复合约束的多个字段只要有一个不同,那就是不同

INSERT INTO USER

VALUES(1,'Tom','abc');



INSERT INTO USER

VALUES(1,'Tom1','abc');#可以添加成功



SELECT * FROM USER;

 删除唯一约束

①添加唯一性约束的列上也会自动创建唯一索引

删除唯一约束只能通过删除唯一索引的方式删除。

③删除时需要指定唯一索引名,唯一索引名就和唯一约束名一样

如果创建唯一约束时未指定名称,如果是单列,就默认和列名相同;如果是组合列,那么默认和() 中排在第一个的列名相同。也可以自定义唯一性约束名。

格式:

ALTER    TABLE   表名

DROP    INDEX     唯一索引名;

主键约束

作用

用来唯一标识表中的一行记录。

关键字

primary key

特点

①主键约束相当于唯一约束+非空约束的组合主键约束列不允许重复,也不允许出现空值。

一个表最多只能有一个主键约束,建立主键约束可以在列级别创建,也可以在表级别上创建。

主键约束对应着表中的一列或者多列(复合主键)

如果是多列组合的复合主键约束,那么这些列都不允许为空值,并且组合的值不允许重复。

MySQL主键名总是PRIMARY,就算自己命名了主键约束名也没用。

当创建主键约束时,系统默认会在所在的列或列组合上建立对应的主键索引(能够根据主键查询

的,就根据主键查询,效率更高)。如果删除主键约束了,主键约束对应的索引就自动删除了。

需要注意的一点是,不要修改主键字段的值。因为主键是数据记录的唯一标识,如果修改了主键的值,就有可能会破坏数据的完整性。 

添加主键约束

①创建表时

列级约束:

create table 表名称(

字段名 数据类型,

字段名 数据类型,

字段名 数据类型 primary  key,

字段名 数据类型

);

表级约束:(上一个字段类型后要加逗号)

create table 表名称(

字段名 数据类型,

字段名 数据类型,

字段名 数据类型,

[constraint 约束名] primary   key(字段名)

);

 

ALTER TABLE

格式:

ALTER  TABLE  表名

ADD  PRIMARY  KEY (列名一个或多个)

举例:

 

#一个表中只能有一个主键约束;特征:非空且唯一

CREATE TABLE test3(

id INT PRIMARY KEY,#列级约束

last_name VARCHAR(15),

salary DOUBLE(10,2),

email VARCHAR(25)

);



CREATE TABLE test3(

id INT,

last_name VARCHAR(15),

salary DOUBLE(10,2),

email VARCHAR(25),

#表级约束

CONSTRAINT pk_test5_id PRIMARY KEY(id)#MySQL的主键名总是PRIMARY,即使命名了

);

举例:

#在alter table 时添加约束

CREATE TABLE test4(

id INT,#列级约束

last_name VARCHAR(15),

salary DOUBLE(10,2),

email VARCHAR(25)

);



ALTER TABLE test4

ADD PRIMARY KEY (id);

关于复合主键

create table 表名称(

字段名 数据类型,

字段名 数据类型,

字段名 数据类型,

primary key(字段名1,字段名2) #表示字段1和字段2的组合是唯一的,也可以有更多个字段

);

 

删除主键约束(在实际开发中不会删除主键约束)

格式:

alter table 表名称 drop primary key;

说明:删除主键约束,不需要指定主键名,因为一个表只有一个主键,删除主键约束后,非空还存

在。

自增列:AUTO_INCREMENT

开发中一旦主键作用的字段上声明有AUTO_INCREMNENT,则我们在添加数据时,就不要给主键对应的字段赋值。

作用:

某个字段的值自增

关键字

auto_increment

 特点和要求

(1)一个表最多只能有一个自增长列

(2)当需要产生唯一标识符或顺序值时,可设置自增长

(3)自增长列约束的列必须是键列(主键列,唯一键列)

(4)自增约束的列的数据类型必须是整数类型

(5)如果自增列指定了 0 和 null,会在当前最大值的基础上自增;如果自增列手动指定了具体值,直接

赋值为具体值。

添加自增约束

①在创建表时添加

CREATE TABLE test5(
id INT PRIMARY KEY AUTO_INCREMENT,
last_name VARCHAR(15)
);

INSERT INTO test5(last_name)
VALUES('Tom');
SELECT * FROM test5;
#当我们向主键(含auto_increment)的字段上添加0或null时,
#实际上会自动的往上添加指定的字段数值(即0与null添加不上去,他依然自增)

#当我们向主键(含auto_increment)的字段上添加一个之前没有的值,可以添加成功,后面自增以它为初始值增长
INSERT INTO test5(id,last_name)
VALUES(6,'Tom');
SELECT * FROM test5;

②在alter table 时添加AUTO_INCREMENT

格式:

alter table 表名称 modify 字段名 数据类型 auto_increment;#给这个字段增加自增约束

举例:

CREATE TABLE test6(

id INT PRIMARY KEY,

last_name VARCHAR(15)

);



ALTER TABLE test6

MODIFY id INT AUTO_INCREMENT;



DESC test6;

③如何删除自增约束:

格式:

alter table 表名称 modify 字段名 数据类型; #去掉auto_increment相当于删除

MySQL 8.0新特性自增变量的持久化

① 在MySQL 5.7系统中,对于自增主键的分配规则,是由InnoDB数据字典

内部一个 计数器 来决定的,而该计数器只在 内存中维护 ,并不会持久化到磁盘中。当数据库重启时,该计数器会被初始化。

MySQL 8.0将自增主键的计数器持久化到 重做日志 中。每次计数器发生改变,都会将其写入重做日志中。如果数据库重启,InnoDB会根据重做日志中的信息来初始化计数器的内存值。

作用

限定某个表的某个字段的引用完整性。(从表中添加的字段必须是主表中有的)

关键字

FOREIGN KEY

主表和从表/父表和子表

主表(父表):被引用的表,被参考的表

从表(子表):引用别人的表,参考别人的表

特点

(1)从表的外键列,必须引用/参考主表的主键或唯一约束的列 (主表中被关联的键必须声明为主键约束或是唯一性约束)因为被依赖/被参考的值必须是唯一的

2)在创建外键约束时,如果不给外键约束命名默认名不是列名,而是自动产生一个外键名

(3)创建(CREATE)表时就指定外键约束的话,先创建主表,再创建从表

(4)删表时,先删从表(或先删除外键约束),再删除主表

(5)当主表的记录被从表参照时,主表的记录将不允许删除,如果要删除数据,需要先删除从表中依赖该记录的数据,然后才可以删除主表的数据

(6)从表中指定外键约束,并且一个表可以建立多个外键约束

(7)从表的外键列与主表被参照的列名字可以不相同,但是数据类型必须一样,逻辑意义一致。

9删除外键约束后,必须 手动 删除对应的索引

 

外键约束

添加外键约束

1)建表时

create table 主表名称(

字段1 数据类型 primary key,

字段2 数据类型

);

create table 从表名称(

字段1 数据类型 primary key,

字段2 数据类型,

[CONSTRAINT <外键约束名称>] FOREIGN KEY(从表的某个字段) references 主表名(被参考字段)

);

#(从表的某个字段)的数据类型必须与主表名(被参考字段)的数据类型一致,逻辑意义也一样

#(从表的某个字段)的字段名可以与主表名(被参考字段)的字段名一样,也可以不一样

-- FOREIGN KEY: 在表级指定子表中的列

-- REFERENCES: 标示在父表中的列

 

举例:

#先创建主表

CREATE TABLE dept1(

dept_id INT PRIMARY KEY,#(主表中被关联的键必须声明为主键约束或是唯一性约束)因为被依赖/被参考的值必须是唯一的

dept_name VARCHAR(15)

);

#再创建从表

CREATE TABLE emp1(

emp_id INT PRIMARY KEY AUTO_INCREMENT,

emp_name VARCHAR(15),

department_id INT,

#表级约束

CONSTRAINT fk_emp1_dept_id FOREIGN KEY (department_id) REFERENCES dept1(dept_id)

);

DESC emp1; 

#从表中添加的数据必须是主表中有的

INSERT INTO dept1

VALUES (10,'IT');

INSERT INTO emp1

VALUES(1001,'Tom',10);

#当主表中的字段被关联时,该字段不可以被删除,该数据也不能被修改

DELETE FROM dept1

WHERE dept_id =10;

UPDATE dept1

SET dept_id=10

WHERE dept_id =10;

(2)建表后

格式:

ALTER TABLE 从表名 ADD [CONSTRAINT 约束名] FOREIGN KEY (从表的字段) REFERENCES 主表名(被引用字段) [on update xx][on delete xx];

举例:

#先创建主表

CREATE TABLE dept2(

dept_id INT PRIMARY KEY,

dept_name VARCHAR(15)

);



#再创建从表

CREATE TABLE emp2(

emp_id INT PRIMARY KEY AUTO_INCREMENT,

emp_last_name VARCHAR(20),

department_id INT

);



ALTER TABLE emp2

ADD CONSTRAINT fk_emp_dept2_did FOREIGN KEY(department_id) REFERENCES dept2(dept_id);

总结:约束关系是针对双方的

添加了外键约束后,主表的修改和删除数据受约束

添加了外键约束后,从表的添加和修改数据受约束

在从表上建立外键,要求主表必须存在

删除主表时,要求从表从表先删除,或将从表中外键引用该主表的关系先删除

 

约束等级 (更新用Cascade,删除用Set  null

Cascade方式 在父表上update/delete记录时,同步update/delete掉子表的匹配记录

Set null方式 在父表上update/delete记录时,将子表上匹配记录的列设为null,但是要注意子

表的外键列不能为not null

No action方式 :如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作

Restrict方式 :同no action, 都是立即检查外键约束

Set default方式 (在可视化工具SQLyog中可能显示空白):父表有变更时,子表将外键列设置

成一个默认的值,但Innodb不能识别

对于外键约束,最好是采用: ON UPDATE CASCADE ON DELETE RESTRICT 的方式。(直接将该字段添加到外约束语句的后面)

删除外键约束

流程如下:

(1)第一步先查看约束名和删除外键约束

SELECT * FROM information_schema.table_constraints WHERE table_name = '表名称';#查看某个表的约束名

ALTER TABLE 从表名 DROP FOREIGN KEY 外键约束名;

(2)第二步查看索引名和删除索引。(注意,只能手动删除)

SHOW INDEX FROM 表名称; #查看某个表的索引名

ALTER TABLE 从表名 DROP INDEX 索引名;

DEFAULT约束

作用

给某个字段/某列指定默认值,一旦设置默认值,在插入数据时,如果此字段没有显式赋值,则赋值为默认值。

 关键字

DEFAULT

 如何给字段加默认值

1)建表时

create table 表名称(

字段名 数据类型 primary key,

字段名 数据类型 unique key not null,

字段名 数据类型 unique key,

字段名 数据类型 not null default 默认值,

); 

(2)建表后

alter table 表名称 modify 字段名 数据类型 default 默认值;

#如果这个字段原来有非空约束,你还保留非空约束,那么在加默认值约束时,还得保留非空约束,否则非空约束就被删除了

#同理,在给某个字段加非空约束也一样,如果这个字段原来有默认值约束,你想保留,也要在modify语句中保留默认值约束,否则就删除了

alter table 表名称 modify 字段名 数据类型 default 默认值 not null;

如何删除默认值约束

alter table 表名称 modify 字段名 数据类型 ;#删除默认值约束,也不保留非空约束

alter table 表名称 modify 字段名 数据类型 not null; #删除默认值约束,保留非空约束

alter table employee modify gender char; #删除gender字段默认值约束,如果有非空约束,也一并删除

alter table employee modify tel char(11) not null;#删除tel字段默认值约束,保留非空约束

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

通过氧化最小化工艺提高SiC MOSFET迁移率的深入分析

标题 Insight Into Mobility Improvement by the Oxidation-Minimizing Process in SiC MOSFETs&#xff08;TED2024&#xff09; 文章的研究内容 文章的研究内容主要围绕氧化最小化工艺&#xff08;oxidation-minimizing process&#xff09;对碳化硅&#xff08;SiC&…

【Unity小技巧】解决Visual Code中文乱码

在Mac下使用VS Code打开代码时&#xff0c;中文注释显示乱码。 解决方法&#xff1a; VS Code&#xff1a;Setting -> Settings -> 搜索“autoGuessEncoding”&#xff0c;然后勾选上即可。 简体中文的Encoding是GB 2312。

maven 下载依赖 jhash:2.1.2 和对应 jar 包

原文地址 前言 25年新的一年&#xff0c;那就先更新一篇技术文章吧&#xff0c;这个是这几天刚遇到的一个有意思的bug&#xff0c;记录分享一下 原因分析 在使用maven加载一个项目的时&#xff0c;发现maven的依赖一直无法解析&#xff0c;更换阿里云镜像和中央仓库都没办法…

回归预测 | MATLAB基于RF-Adaboost多输入单输出回归预测

回归预测 | MATLAB基于RF-Adaboost多输入单输出回归预测 目录 回归预测 | MATLAB基于RF-Adaboost多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 回归预测 | MATLAB基于RF-Adaboost多输入单输出回归预测。 1.Matlab实现RF-Adaboost随机森林集成学习…

【网络协议】动态路由协议

前言 本文将概述动态路由协议&#xff0c;定义其概念&#xff0c;并了解其与静态路由的区别。同时将讨论动态路由协议相较于静态路由的优势&#xff0c;学习动态路由协议的不同类别以及无类别&#xff08;classless&#xff09;和有类别&#xff08;classful&#xff09;的特性…

基于SSM实现的垃圾分类平台系统功能实现二

一、前言介绍&#xff1a; 1.1 项目摘要 随着城市化进程的加速和居民生活水平的提高&#xff0c;城市生活垃圾的产量急剧增加&#xff0c;给城市环境管理带来了巨大压力。传统的垃圾处理方式&#xff0c;如填埋和焚烧&#xff0c;不仅占用大量土地资源&#xff0c;还可能对环…

如何实现多级缓存?

本文重点说一说在Java应用中&#xff0c;多级缓存如何实现。 多级缓存是比较常见的一种性能优化的手段&#xff0c;一般来说就是本地缓存分布式缓存。 本地缓存一般采用Caffeine和Guava&#xff0c;这两种是性能比较高的本地缓存的框架。他们都提供了缓存的过期、管理等功能。…

美摄科技为企业打造专属PC端视频编辑私有化部署方案

美摄科技&#xff0c;作为视频编辑技术的先行者&#xff0c;凭借其在多媒体处理领域的深厚积累&#xff0c;为企业量身打造了PC端视频编辑私有化部署解决方案&#xff0c;旨在帮助企业构建高效、安全、定制化的视频创作平台&#xff0c;赋能企业内容创新&#xff0c;提升品牌影…

嵌入式C语言:什么是指针?

目录 一、指针的基本概念 1.1. 定义指针 1.2. 赋值给指针 1.3. 解引用指针 1.4. 指针运算 1.5. 空指针 1.6. 函数参数 1.7. 数组和指针 1.8. 示例代码 二、指针在内存中的表示 2.1. 内存地址存储 2.2. 内存模型 2.3. 指针与硬件交互 2.4. 示例代码 三 、指针的重…

计算机网络相关习题整理

第一讲 传输媒介 【知识点回顾】 两种导线可以减小电磁干扰&#xff1a; 双绞线&#xff08;分为非屏蔽双绞线、屏蔽双绞线&#xff09;&#xff08;RJ-45用&#xff09;同轴电缆&#xff08;短距离使用&#xff09;网络通信的基本单位&#xff1a;位&#xff08;bit&#xff…

应急响应之入侵排查(下)

一.进程排查 1.Windows 任务管理器查看 在 Windows 系统中&#xff0c;可通过任务管理器查看进程信息。操作步骤为&#xff1a;在任务管理器界面&#xff0c;于 “查看” 选项中选择 “选择列”&#xff0c;随后添加 “映像路径名称” 和 “命令行”&#xff0c;以此查看更多进…

极狐GitLab 正式发布安全版本17.7.1、17.6.3、17.5.5

本分分享极狐GitLab 补丁版本 17.7.1, 17.6.3, 17.5.5 的详细内容。这几个版本包含重要的缺陷和安全修复代码&#xff0c;我们强烈建议所有私有化部署用户应该立即升级到上述的某一个版本。对于极狐GitLab SaaS&#xff0c;技术团队已经进行了升级&#xff0c;无需用户采取任何…

力扣经典二分题:4. 寻找两个正序数组的中位数

题目链接&#xff1a;4. 寻找两个正序数组的中位数 - 力扣&#xff08;LeetCode&#xff09; 一、题目分析 这道题目是让我们在 两个正序的数组中寻找中位数已知两个数组的大小分别是&#xff1a;int m nums1.size(),n nums2.size();中位数性质1&#xff1a;中位数左侧元素 …

安装yarn时显示npm使用淘宝镜像安装报错

问题描述&#xff1a; npm使用淘宝镜像安装报错 错误原因&#xff1a; 淘宝原镜像域名&#xff08;registry.npm.taobao.org&#xff09;的 HTTPS 证书正式到期&#xff0c;npm 淘宝镜像已经从 registry.npm.taobao.org 切换到了 registry.npmmirror.com。解决方案&#xff1a;…

【Python】Python之Selenium基础教程+实战demo:提升你的测试+测试数据构造的效率!

这里写目录标题 什么是Selenium&#xff1f;Selenium基础用法详解环境搭建编写第一个Selenium脚本解析脚本脚本执行结果常用的元素定位方法常用的WebDriver方法等待机制 Selenium高级技巧详解页面元素操作处理弹窗和警告框截图和日志记录多窗口和多标签页操作 一个实战的小demo…

Seata搭建

1.初识Seata Quick Start | Apache Seata 官网 2.准备nacos和 seata 启动nacos startup.cmd -m standalone账号nacos 密码nacos 搭建seata TC 这里下载的 1.4.2 seata-server-1.4.2 1.修改seata配置文件 registry.conf 这里我们使用nacos作为注册中心 和 配置中心 r…

selenium+pyqt5自动化工具总结

说明&#xff1a;本工具是&#xff0c;操作外部google浏览器、selenium是无法操作qt界面中嵌套的浏览器的&#xff0c; 工具在后面 1. 代码结构 pycharm打开的文件下&#xff0c;再写一个子文件&#xff0c;文件导入的时候把子文件名带上 这样就可以在 外层使用命令 pyinst…

.NET 终止或结束进程

如何使用 C# 终止进程。 使用简单的方法终止.NET中的现有进程Process.Kill()。有一个可选参数 true 或 false&#xff0c;用于结束与要结束的进程相关的所有子进程。 了解如何创建流程。 结束当前进程&#xff1a; System.Diagnostics.Process.GetCurrentProcess().Kill(tru…

怎么实现Redis的高可用?

大家好&#xff0c;我是锋哥。今天分享关于【怎么实现Redis的高可用&#xff1f;】面试题。希望对大家有帮助&#xff1b; 怎么实现Redis的高可用&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 为了实现 Redis 的高可用性&#xff0c;我们需要保证在发…

大数据技术实训:Hadoop完全分布式运行模式配置

准备&#xff1a; 1&#xff09;准备3台客户机&#xff08;关闭防火墙、静态ip、主机名称&#xff09; 2&#xff09;安装JDK 3&#xff09;配置环境变量 4&#xff09;安装Hadoop 5&#xff09;配置环境变量 6&#xff09;配置集群 7&#xff09;单点启动 8&#xff09;配置ss…