第11章:约束

news2024/10/6 14:27:01

一、数据完整性与约束的分类

1.为什么需要约束constraint

SQL以约束方式对表数据进行额外的条件限制。

为了保证数据的完整性,SQL对表数据进行条件限制

①实体完整性:同一个表,不能存在两条相同无法区分的记录

②域完整性:年龄范围0-120,性别是男/女

③引用完整性:员工表员工所在的部门,要在部门表里找到

④用户自定义完整性:用户名唯一,密码不为空

2.什么是约束

约束是表级的强制规定

在创建表create table规定约束,创建表后alter table规定约束

3.约束的分类

角度1:约束的字段个数

单列约束 vs 多列约束

角度2:约束的作用范围

列级约束:将声明约束在对应字段的后面

表级约束:在表中所有字段声明完成后,在所有字段后面声明的约束

角度3:约束的作用

①not null 非空约束

②unique 唯一性约束

③primary key 主键约束

④foreign key 外键约束

⑤check 检查约束

⑥default 默认值约束

4.查看约束

SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE table_name='表名';

5.添加约束总结、

alter table ***

modify 字段名 数据类型  default/not null

alter table ***

add unique(字段名,字段名);

add primary key (字段名);

add foreign key (从表.字段) references 主表名(主表.字段);

二、非空约束not null

1.作用

限制值不能为空

 

2.特点

①默认情况下所有类型是NULL

②某个列单独为非空,不能组合列非空

③很多列可以设置非空

④空字符’’不是NULL,0也不是NULL

3.创建表添加非空not null 约束

 

CREATE TABLE test1 (

  id int(11) NOT NULL,

  last_name varchar(15) NOT NULL,

  email varchar(25),

  salary decimal(10,2)

)

 

4.已有表添加非空约束

①格式

alter table 表名称 modify 字段名 数据类型 not null;

②举例

alter table test1

modify email varchar(25) not null

5.删除约束

①格式

alter table 表名称 modify 字段名 数据类型

或者

alter table 表名称 modify 字段名 数据类型 null

②举例

alter table test1

modify email varchar(25) null

三、唯一性约束unique

1.作用

用来限制字段的值不能重复,但是可以为NULL,允许出现多个NULL

 

2.特点

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

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

③唯一性约束允许列值为空。

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

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

3.创建表添加唯一约束

 测试:id和email不能重复

create table test2(
id int unique, #列级约束
last_name varchar(15),
email varchar(15),
salary decimal(10,2),
# 表级约束
constraint uk_test2_email unique(email)
);

4.已有表添加唯一约束

alter table test2
modify salary decimal(10,2) unique

5.复合(多列)唯一性约束

创建表 name-password为组合约束

create table user(
id int,
name varchar(15),
password varchar(25),
# 表级约束
constraint uk_user_name_pwd unique(name,password)
);

测试 name和pawword看成整体

insert into user(id,name,password)
values
(1,'z','w'),
(2,'z','z')

6.删除唯一性约束:根据唯一索引删除

添加唯一性约束的时候,会自动创建唯一索引。删除根据索引名(跟约束名相同)删除。

alter table user

drop index uk_user_name_pwd

7.查看表的索引

show index from 表名称

四、主键约束primary key

1.作用

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

2.关键字

primary key

3.特点:非空且唯一

 

①一个表里面有且仅有一个主键,可以存在复合主键

②复合主键的列都不为空,组合的值不重复

③主键名是primary,创建主键时会建立主键索引

4.新建表创建主键

 

①举例

create table temp(

id int primary key,

name varchar(20)

);

create table temp2(

id int,

name varchar(20),

primary key(id)

);

5.已有表添加主键

#字段列表是一个字段,也可以是多个字段

ALTER TABLE 表名称 ADD PRIMARY KEY(字段列表);

举例

ALTER TABLE student ADD PRIMARY KEY (sid);

ALTER TABLE emp5 ADD PRIMARY KEY(name,pwd);

6.复合主键

方式一:创建表添加复合主键

 方式二:已有表添加复合主键

ALTER TABLE 表名称 ADD PRIMARY KEY(字段列表);

7.删除主键约束

alter table 表名称 drop primary key;

删除主键约束,此时的非空还存在,只是不唯一了

五、自增列 auto_increment

1.作用

某个字段的值自增

2.关键字

auto_increment

3.特点

①一般加在主键/唯一性约束的后面

②类型必须是int

4.创建表时创建自增列

create table test7(
id int PRIMARY key AUTO_INCREMENT,
name varchar(15)
);

测试

省略自增列

insert into test7(name)

values

('wang'),

('zhang'),

('sun')

 如果自增列指定了 0 和 null,会在当前最大值的基础上自增

insert into test7(id,name)
values 
(0,'wang1'),
(null,'zhang1')

 如果自增列手动指定了具体值,直接赋值为具体值。

insert into test7(id,name)
values 
(8,'wang1')

5.修改表时创建自增列

alter table 表名称

modify 字段名 数据类型 auto_increment;

create table test8(
id int primary key,
name varchar(15)
);

alter table test8
modify id int auto_increment;

6.开发中遇到auto_increment字段时

不要给该字段赋值,省略过去

7.删除自增列auto_increment

alter table 表名称

modify 字段名 数据类型

alter table test8
modify id int

六、外键 foreign key

1.作用

限定表中的某个字段的引用完整性

比如:员工表所在的部门号,必须在部门表里有这个部门号。

2.关键字

foreign key

3.特点

①子表的外键必须引用父表的主键或唯一约束。因为添加外键时被引用父表的值是唯一的

②创建外键时,要先有主表

③删表时,先删除子表(有外键的表)在删除父表

④要删除父表的记录时(部门表)先删除子表(员工表)引用的该部门记录,然后才能删除成功。

⑤一个表可以有多个外键约束

⑥主键和外键的名称可以不一样,但是类型必须一样

⑦创建外键约束时,会在所在的列创建普通索引。删除外键约束,手动删除索引

4.创建表时添加外键

先创建主表

create table dept1(
dept_id int primary key,
dept_name varchar(15)
);

再创建子表

create table emp1(
id int primary key,
name varchar(15),
dept_id int,
constraint fk_emp1_dept_id foreign key(dept_id) references dept1(dept_id)
);

5.已有表时添加外键

先创建父表

create table dept2(
dept_id int primary key,
dept_name varchar(15)
);

再创建子表

create table emp2(
id int primary key,
name varchar(15),
dept_id int
);

alter table emp2

add foreign key (dept_id) references dept2(dept_id)

6.错误演示

①主表的dept_id没有主键或唯一性约束

create table dept3(

dept_id int,

dept_name varchar(15)

);

create table emp3(

id int primary key,

name varchar(15),

dept_id int,

constraint fk_emp1_dept_id foreign key(dept_id) references dept1(dept_id)

);

7.演示外键增删改

①部门表

 ②增加员工表(部门号是部门表已经有的,不然a foreign key constraint fails失败)

insert into emp1(id,name,dept_id)

values

(1,'wang',101)

删除部门表的财务部

先把子表员工表引用的财务部的记录删除,才能删除父表部门表的记录。

delete from emp1

where dept_id =101;

delete from dept1

where dept_id =101;

9.删除外键约束

10.开发场景

问题1:如果两个表之间有关系(一对一、一对多),比如:员工表和部门表(一对多),它们之间是否 一定要建外键约束?

不一定

问题2:建和不建外键约束有什么区别?

建立外键:操作受到语法层面的限制

不建立外键:操作不受限制,保证数据引用的完整性,靠程序员自觉或java程序中进行限定

问题3:那么建和不建外键约束和查询有没有关系?

没有

11.阿里开发规范

不使用外键,外键概念在应用层解决。

说明:外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度。

 

七、检查约束 check

1.作用:

检查某个字段的值的范围符合xx要求

2.关键字

check

3.MySQL5.7不支持,运行不报错,但不起作用。MySQL 8.0支持。Oracle支持

4.示例

create table test10(

id int,

last_name varchar(15),

salary decimal(10,2) check(salary > 2000)

);

①插入演示

insert into test10(id,last_name,salary)

values

(1,'wang',1000);错误

insert into test10(id,last_name,salary)

values

(2,'zhang',3000);正确

八、默认约束 default

1.作用

默认值约束,插入数据时,字段没有显式赋值,就赋值为默认值

2.创建表时增加默认约束

create table test11(

id int,

last_name varchar(15),

salary DECIMAL(10,2) default 2000

);

演示一:

insert into test11(id,last_name,salary)

values

(1,'wang',null), #成功

(1,'wang') #失败,字段和值的数目不匹配

演示二:

insert into test11(id,last_name)

values

(2,'zhang')

3.已有表时增加默认约束

创建默认约束时,检查此字段是否非空,如果非空记得添加 default 默认值 not null;

九、面试

1.为什么建表时,加not null default’’或default 0,为什么?

答:不想出现null值。

①不好比较。参与运算时返回的都是null

②效率不高,影响提高索引效果

面试2:带auto_increment的约束字段值都是从1开始吗?

答:①默认是从1开始,每新增一条记录字段自动加1。

②还可以自定义第一条插入记录的自增字段值,以后插入就会根据这个值自动加1

③添加主键约束时,往往设置字段自增属性

面试3:每个表都可以任意选择存储引擎吗?

外键约束不支持跨引擎使用。

MySQL支持每个表的引擎不同。但是外键约束不支持跨引擎使用,因为保证数据参照的完整性。

如果不同引擎的表之间需要关联外键,那么表之间不能创建外键约束。存储引擎的选择不是完全随意的。

十、练习

练习一

已经存在数据库test04_emp,两张表emp2和dept2

题目:

#1.向表emp2id列中添加PRIMARY KEY约束

alter table emp2

add primary key(id)

#2. 向表dept2id列中添加PRIMARY KEY约束

alter table dept2

add primary key(id)

#3. 向表emp2中添加列dept_id,并在其中定义FOREIGN KEY约束,与之相关联的列是dept2表中的id列。

alter table emp2

add column dept_id int

alter table emp2

add foreign key(dept_id) references dept2(id)

练习二

# 1、创建数据库test01_library

create database if not exists test01_library

# 2、创建表 books,表结构如下:

create table books(

id int,

name varchar(50),

authors varchar(100),

price float,

pubdate year,

note varchar(100),

num int

);

# 3、使用ALTER语句给books按如下要求增加相应的约束

 

Id

alter table books

add primary key(id);

alter table books

modify id int auto_increment;

name

alter table books

modify name varchar(50) not null;

authors

alter table books

modify authors varchar(100) not null;

price

alter table books

modify price float not null;

year

alter table books

modify pubdate year not null;

num

alter table books

modify num int not null;

练习三

#1. 创建数据库test04_company

create database if not exists test04_company

#2. 按照下表给出的表结构在test04_company数据库中创建两个数据表officesemployees

 

create table offices(

officeCode int(10) primary key,

city varchar(50) not null,

address varchar(50),

country varchar(50) not null,

postalCode varchar(15) unique

);

create table employees(

employeeNumber int(11) primary key auto_increment,

lastName varchar(50) not null,

firstName varchar(50) not null,

mobile varchar(25) unique,

officeCode int(10),

jobTitle varchar(50) not null,

birth datetime not null,

note varchar(255),

sex varchar(5),

foreign key(officeCode) references offices(officeCode)

);

#3. 将表employeesmobile字段修改到officeCode字段后面

ALTER TABLE employees MODIFY mobile VARCHAR(25) AFTER officeCode;

#4. 将表employeesbirth字段改名为employee_birth

alter table employees

change birth employee_birth datetime not null

#5. 修改sex字段,数据类型为CHAR(1),非空约束

alter table employees

modify sex char(1) not null

#6. 删除字段note

alter table employees

drop column note

#7. 增加字段名favoriate_activity,数据类型为VARCHAR(100)

alter table employees

add column favoriate_activity varchar(100)

#8. 将表employees名称修改为employees_info

rename table employees to employees_info

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

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

相关文章

【数据结构】入门及时间空间复杂度的介绍

🌱博客主页:大寄一场. 🌱系列专栏:数据结构与算法 😘博客制作不易欢迎各位👍点赞⭐收藏➕关注 目录 前言 1.什么是数据结构? 2.什么是算法? 3.数据结构和算法的重要性 4.常见的数…

【杂记】Rest风格

文章目录 1.什么是Rest?2.URI URL URN3.什么是Restful架构风格4.状态转换 1.什么是Rest? Rest是一种软件架构的风格。 英文名称:REpresentational State Transfer(表现层状态转移) 加上主语:Resource Repr…

Linux网络基础-3

在上一篇网络基础的博客当中,我们对应用层协议--HTTP协议进行了详解,接下来我们对传输层协议进行详解 目录 1.传输层协议 2.UDP协议 2.1协议内容 2.2协议格式 2.3协议特性 3.TCP协议 3.1协议内容 3.2协议格式 3.3协议特性 3.3.1三次握手建立连…

Bootstrap开发之——Bootstrap安装及使用(02)

一 概述 Bootstrap下载npm安装bootstrap并使用(vue中使用)bootstrap通过本地lib导入并使用(html)bootstrap通过cdn导入并使用(html) 二 Bootstrap下载 2.1 Bootstrap下载(v3.x版本为例) 在Bootstrap中文官网,点击顶部的入门标签,在如下图页面点击下载…

Linux——对权限的理解

文章目录 总述Linux权限的概念Linux 权限管理Linux对文件访问者的分类文件类型和访问权限a.文件类型b.基本权限文件权限修改的相关方法 其他问题在首次创建时文件的权限属性是固定的吗?目录的权限粘滞位 总述 本篇博客将主要讲解linux系统中权限的概念,权…

Sort练习题

sort 练习 练习题 题目&#xff1a;浮点数排序 #define _CRT_SECURE_NO_WARNINGS #include <cstdio> #include <algorithm> //sort()排序 #include <cmath> //round()来找最近的整数 using namespace std; const double EPSILON 1e-6; //两个浮点…

web框架:Iris快速入门

web框架&#xff1a;Iris快速入门 1 介绍及安装 介绍 Iris是一款用Go开发的web应用框架&#xff0c;被称为速度最快的Go后端开发框架。官网地址&#xff1a;https://www.iris-go.com/中文教程地址&#xff1a;http://www.codebaoku.com/iris/iris-index.html 安装 环境要求&a…

QTableView编程——Model/View架构(单元格随意拖拽交换)

QTableView编程——Model/View架构 基础知识 添加表头 //准备数据模型QStandardItemModel *student_model new QStandardItemModel();student_model->setHorizontalHeaderItem(0, new QStandardItem(QObject::tr("Name")));student_model->setHorizontalHea…

【Redis】Redis位图(bitmap)介绍和在签到场景的应用

文章目录 一、前言二、redis位图相关指令setbit命令getbit命令bitcount命令bitfield命令bitpos命令bitop命令 三、应用场景累计签到应用场景连续签到应用场景日期签到场景应用详情 一、前言 基本原理&#xff1a; 《Redis设计与实现》中对位图的实现描述是&#xff1a;Redis使…

做软件测试我该如何快速摸清一家公司的基本情况?

当你准备进入一家新的公司作为软件测试人员时&#xff0c;了解公司的基本情况对于你快速适应新环境和工作非常重要。下面是几个方面可以帮助你快速摸清一家公司的基本情况&#xff1a; 如果你想学习软件测试&#xff0c;我这边给你推荐一套视频&#xff0c;这个视频可以说是B站…

8. 高性能业务表结构设计和索引知识深化

MySQL性能调优 1. 数据库表设计1.1 范式化设计1.1.1 什么是范式&#xff1f;1.1.2 第一范式&#xff08;1NF&#xff09;1.1.2 第二范式&#xff08;2NF&#xff09;1.1.3 第三范式&#xff08;3NF&#xff09; 1.2 反范式设计1.2.1 什么叫反范式化设计 1.3 范式化和反范式总结…

分析SpringBoot 底层机制【Tomcat 启动分析+Spring 容器初始化+Tomcat 如何关联Spring 容器之源码分析

目录 分析SpringBoot 底层机制【Tomcat 启动分析Spring 容器初始化Tomcat 如何关联Spring 容器之源码分析 搭建SpringBoot 底层机制开发环境 创建Maven 项目wyx-springboot 修改pom.xml , 导入相关依赖 创建MainApp.java 启动项目ok, 大家注意Tomcat 也启动了[这里思考, …

机器学习期末复习 BP神经网络的推导,4X4X3,激活函数变为Logistic函数,其他不变

刚写完了bp神经网络的实验课代码&#xff0c;对这个比较熟悉&#xff08;后面给出实现代码&#xff09; Logistic函数也就是sigmod函数&#xff0c;表达式是这样的&#xff1a; def sigmod(x):return 1/(1math.exp(-x)) sigmod函数是隐层和输出层的激活函数&#xff08;sigmo…

如何本地搭建Plex私人影音云盘教程,实现Plex家庭影音中心,打造超级多媒体中心

文章目录 1.前言2. Plex网站搭建2.1 Plex下载和安装2.2 Plex网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 转发自CSDN远程穿透的文章&#xff1a;免费搭建Plex家庭影音中心 - 打造超级多媒体中心【公网远程访问…

WEBPACK、VITE 常用配置(对照)及迁移指南

文中 Webpack 版本为 5.x&#xff0c;Vite 版本为 4.3.x webpack 是新一代构建工具里面的老大哥了&#xff0c;从 2013 年发布已经持续升级 10 年&#xff0c;形成完备的生态环境。vite 则是下一代前端开发与构建工具&#xff0c;2019年发布&#xff0c;最新发布版本 4.3.3&…

文件操作安全之-文件上传告警运营篇

本文从文件上传的定义&#xff0c;文件上传的IDS规则&#xff0c;文件上传的示例&#xff0c;文件上传的告警研判&#xff0c;文件上传的处置建议等几个方面阐述如何通过文件上传类型的告警的线索&#xff0c;开展日常安全运营工作&#xff0c;从而挖掘有意义的安全事件。 文件…

rtl仿真器-iverilog icarus安装和测试

Icarus Verilog是一个轻量、免费、开源的Verilog编译器&#xff0c;基于C实现&#xff0c;开发者是 Stephen Williams &#xff0c;遵循 GNU GPL license 许可证&#xff0c;安装文件中已经包含 GTKWave支持Verilog/VHDL文件的编译和仿真&#xff0c;命令行操作方式&#xff0c…

C语言函数大全-- _w 开头的函数(1)

C语言函数大全 本篇介绍C语言函数大全-- _w 开头的函数 1. _waccess 1.1 函数说明 函数声明函数功能int _waccess(const wchar_t* path, int mode);用于测试文件或目录是否存在&#xff0c;并检查程序是否具有对它们的访问权限 参数&#xff1a; path &#xff1a; 待测试的…

Elasticsearch(三)

Elasticsearch(三) 数据聚合 聚合的分类 文档&#xff1a;https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations.html 聚合可以实现对文档数据的统计、分析、运算。聚合常见的有三类&#xff1a; 桶聚合&#xff1a;用来对文档做分组 Te…

【P22】JMeter 调试后置处理程序(Debug PostProcessor)

&#xff08;1&#xff09;、测试计划右键 <<< 添加 <<< 线程&#xff08;用户&#xff09;<<< 线程组 默认参数即可 &#xff08;2&#xff09;、线程组右键 <<< 添加 <<< 取样器 <<< 调试取样器 默认参数即可 &…