软件设计之MySQL(6)

2024-08-24 18:28
文章标签 mysql database 软件设计

本文主要是介绍软件设计之MySQL(6),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

软件设计之MySQL(6)

此篇应在JavaSE之后进行学习:
路线图推荐:
【Java学习路线-极速版】【Java架构师技术图谱】
Navicat可以在软件管家下载
``
使用navicat连接mysql数据库创建数据库、表、转储sql文件,导入sql数据
MySQL数据库入门到大牛,mysql安装到优化,百科全书级,全网天花板
资料可以去尚硅谷官网免费领取

学习内容:

  1. 约束概述
  2. 非空约束
  3. 唯一性约束
  4. 主键约束
  5. 外键约束
  6. 检查约束
  7. 默认值约束

1、约束概述

为什么要约束

数据完整性是指数据的精确性可靠性。它是防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信息而提出的
1、实体完整性 :例如,同一个表中,不能存在两条完全相同无法区分的记录
2、域完整性 :例如:年龄范围0-120,性别范围“男/女”
3、引用完整性:例如:员工所在部门,在部门表中要能找到这个部门
4、用户自定义完整性 :例如:用户名唯一、密码不能为空等,本部门经理的工资不得高于本部门职工的平均工资的5倍。

约束的分类

1、角度1:约束的字段的个数
单列约束vs多列约束
2、角度2:约束的作用范围
列级约束:将此约束声明在对应字段的后面
表级约束:在表中所有字段都声明完,在所有字段后面声明的约束
3、角度3:约束的作用(功能)
① not null 非空约束
②unique 唯一性约束
③ primary key 主键约束
④ foreign key 外键约束
⑤ check 检查约束
⑥ default 默认值约束

如何添加约束

1、CREATE TABLE 时添加约束
2、ALTER TABLE 时添加约束、删除约束

如何查看表中的约束

SELECT * FROM information_schema.table_constraints
WHERE table_name = '表名称';

2、非空约束

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

# 在CREATE TABLE时添加约束
CREATE TABLE student(
sid INT,
sname VARCHAR(20) NOT NULL,
tel CHAR(11) ,
cardid CHAR(18) NOT NULL
);
#下段代码会报错,因为sname和cardid默认为NULL了
#INSERT INTO student (sid,tel)
#VALUES(1,'111');
#在ALTER TABLE时添加约束
ALTER TABLE student
MODIFY tel CHAR(11) NOT NULL;
#在ALTER TABLE时删除约束
ALTER TABLE student
MODIFY sid INT NULL;

3、唯一性约束

1、 同一个表可以有多个唯一约束。
2、唯一约束可以是某一个列的值唯一,也可以多个列组合的值唯一。
3、唯一性约束允许列值为空(可以允许多个NULL存在)。
4、在创建唯一约束的时候,如果不给唯一约束命名,就默认和列名相同。
5、MySQL会给唯一约束的列上默认创建一个唯一索引。

#在CREATE TABLE时添加约束
CREATE TABLE USER(
id INT NOT NULL,
NAME VARCHAR(25) UNIQUE, #列级约束  #NAME为该约束的名称(默认和列名相同)
PASSWORD VARCHAR(16),
-- 使用表级约束语法
CONSTRAINT uk_name_pwd UNIQUE(PASSWORD)  #uk_name_pwd为该约束的名称
);
#添加NULL值,可以多次添加并且不报错
INSERT INTO USER (id,NAME,PASSWORD)
VALUES
(1,'TOM',NULL),
(2,'MIKE',NULL);
#在ALTER TABLE时添加约束
#方式1:alter table 表名称 add unique key(字段列表);
ALTER TABLE USER
ADD CONSTRAINT user_info UNIQUE (id);#user_info为该约束名称(类似表级约束)
#方式2:alter table 表名称 modify 字段名 字段类型 unique;
#先添加一个字段用来实验
ALTER TABLE USER
ADD COLUMN email VARCHAR(20);
ALTER TABLE USER 
MODIFY email VARCHAR(20) UNIQUE;

复合的唯一性约束

CREATE TABLE USER(
id INT NOT NULL,
NAME VARCHAR(25) 
PASSWORD VARCHAR(16),
-- 使用表级约束语法
#CONSTRAINT uk_name_pwd UNIQUE(NAME,PASSWORD)  #uk_name_pwd为该约束的名称(功能上等价)
UNIQUE KEY (NAME,PASSWORD) #复合唯一约束,该约束名称为NAME(默认和()中排在第一个的列名相同)
);
#只限制NAME和PASSWORD都相等的情况
INSERT INTO USER
VALUES
(1,'TOM','abc'),
(1,'TOM1','abc');

删除唯一性约束

1、添加唯一性约束的列上也会自动创建唯一索引
2、删除唯一约束只能通过删除唯一索引的方式删除。
3、删除时需要指定唯一索引名,唯一索引名就和唯一约束名一样。
4、如果创建唯一约束时未指定名称,如果是单列,就默认和列名相同;如果是组合列,那么默认和()中排在第一个的列名相同。也可以自定义唯一性约束名。
5、可以通过show index from 表名称;查看表的索引

#删除语句
ALTER TABLE USER
DROP INDEX uk_name_pwd;

4、主键约束

用来唯一标识表中的一行记录
主键约束相当于唯一约束+非空约束的组合,主键约束列不允许重复,也不允许出现空值。
1、一个表最多只能有一个主键约束,建立主键约束可以在列级别创建,也可以在表级别上创建。
2、主键约束对应着表中的一列或者多列(复合主键)
3、如果是多列组合的复合主键约束,那么这些列都不允许为空值,并且组合的值不允许重复。
4、MySQL的主键名总是PRIMARY,就算自己命名了主键约束名也没用。
5、当创建主键约束时,系统默认会在所在的列或列组合上建立对应的主键索引(能够根据主键查询的,就根据主键查询,效率更高)。如果删除主键约束了,主键约束对应的索引就自动删除了。
6、需要注意的一点是,不要修改主键字段的值。因为主键是数据记录的唯一标识,如果修改了主键的值,就有可能会破坏数据的完整性

#id非空且不允许重复
CREATE TABLE test(
id INT PRIMARY KEY,# 列级约束
last_name VARCHAR(15),
salary DECIMAL(10,2),
email VARCHAR(25)
#表级约束
-- CONSISTENT pk_test_id PRIMARY KEY(id) 没必要取名
#ALTER TABLE 表名称 ADD PRIMARY KEY(字段列表);
#复合主键
CREATE TABLE test1(
id INT,
NAME VARCHAR(15),
PASSWORD VARCHAR(25),
PRIMARY KEY (NAME,PASSWORD)
);
#NAME、PASSWORD都不允许为空值
--INSERT INTO test1
--VALUES(1,,'TOM',NULL);
#删除主键约束(实际开发中,不会删除表中主键约束)
ALTER TABLE test drop primary key;

AUTO_INCREMENT

作用:某个字段的值自增
(1)一个表最多只能有一个自增长列
(2)当需要产生唯一标识符或顺序值时,可设置自增长
(3)自增长列约束的列必须是键列(主键列,唯一键列)
(4)自增约束的列的数据类型必须是整数类型
(5)如果自增列指定了 0 和 null,会在当前最大值的基础上自增;如果自增列手动指定了具体值,直接赋值为具体值。
开发中,一旦主键作用的字段声明了AUTO_INCREMENT,则在添加数据时,不要给主键对应字段去赋值了

CREATE TABLE test(
id INT PRIMARY KEY AUTO_INCREMENT,
last_name VARCHAR(15)
);
INSERT INTO test(last_name)
VALUES('TOM');
INSERT INTO test(id,last_name)
VALUES(0,'TOM'); #2 TOM
INSERT INTO test(id,last_name)
VALUES(NULL,'TOM');# 3 TOM
INSERT INTO test(id,last_name)
VALUES(10,'TOM');# 10 TOM
INSERT INTO test(last_name)
VALUES('TOM');# 11 TOM
#删除AUTO_INCREMENT
ALTER TABLE test
MODIFY id INT;

5、外键约束

作用:限定某个表的某个字段的引用完整性比如:员工表的员工所在部门的选择,必须在部门表能找到对应的部分。
图中上表称为主表(父表),下表称为从表(子表)
在这里插入图片描述
主表(父表):被引用的表,被参考的表
从表(子表):引用别人的表,参考别人的表
特点
1、从表的外键列,必须引用/参考主表的主键或唯一约束的列
2、在创建外键约束时,如果不给外键约束命名,默认名不是列名,而是自动产生一个外键名
3、删表时,先删从表(或先删除外键约束),再删除主表
4、当主表的记录被从表参照时,主表的记录将不允许删除,如果要删除数据,需要先删除从表中依赖该记录的数据,然后才可以删除主表的数据[关联性问题]
5、在“从表”中指定外键约束,并且一个表可以建立多个外键约束
6、从表的外键列与主表被参照的列名字可以不相同,但是数据类型必须一样,逻辑意义一致
7、创建外键约束会建立对应索引,删除外键约束后,必须 手动 删除对应的索引

#先创建主表
CREATE TABLE dept1(
dept_id INT 
dept_name VARCHAR(15)
);
#要设置主键或唯一性约束
ALTER TABLE dept1
ADD PRIMARY KEY (dept_id);
#再创建从表
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)
);
#
INSERT INTO dept1
VALUES(10,'IT')
#主表添加完部门以后再在从表添加部门相关数据
INSERT INTO emp1
VALUES(1001,'TOM',10);

约束等级

Cascade方式 :在父表上update/delete记录时,同步update/delete掉子表的匹配记录
Set null方式 :在父表上update/delete记录时,将子表上匹配记录的列设为null,但是要注意子
表的外键列不能为not null
No action方式 :如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作
Restrict方式 :同no action, 都是立即检查外键约束
Set default方式 :父表有变更时,子表将外键列设置成一个默认的值,但Innodb不能识别
建议:ON UPDATE CASCADE ON DELETE RESTRICT 的方式,即更新采用Cascade,删除采用Restrict

删除外键约束

一个表可以有多个外键约束,所以要指明外键约束名称
在这里插入图片描述

6、检查约束

检查某个字段的值是否符号xx要求,一般指的是值的范围
MySQL5.7 可以使用check约束,但check约束对数据验证没有任何作用;MySQL 8.0中可以使用check约束

CREATE TABLE temp(
id INT AUTO_INCREMENT,
NAME VARCHAR(20),
age INT CHECK(age > 20),
PRIMARY KEY(id)
);

7、默认值约束

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

#在CREATE TABLE添加默认值约束
create table employee(
eid int primary key,
ename varchar(20) not null,
gender char ,
tel char(11) not null default '' #默认是空字符串
);
#ALTER TABLE添加默认值约束
alter table employee 
modify gender char default '男';
##ALTER TABLE删除默认值约束
alter table employee 
modify gender char ;

这篇关于软件设计之MySQL(6)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1103258

相关文章

Mysql 中的多表连接和连接类型详解

《Mysql中的多表连接和连接类型详解》这篇文章详细介绍了MySQL中的多表连接及其各种类型,包括内连接、左连接、右连接、全外连接、自连接和交叉连接,通过这些连接方式,可以将分散在不同表中的相关数据... 目录什么是多表连接?1. 内连接(INNER JOIN)2. 左连接(LEFT JOIN 或 LEFT

mysql重置root密码的完整步骤(适用于5.7和8.0)

《mysql重置root密码的完整步骤(适用于5.7和8.0)》:本文主要介绍mysql重置root密码的完整步骤,文中描述了如何停止MySQL服务、以管理员身份打开命令行、替换配置文件路径、修改... 目录第一步:先停止mysql服务,一定要停止!方式一:通过命令行关闭mysql服务方式二:通过服务项关闭

SQL Server数据库磁盘满了的解决办法

《SQLServer数据库磁盘满了的解决办法》系统再正常运行,我还在操作中,突然发现接口报错,后续所有接口都报错了,一查日志发现说是数据库磁盘满了,所以本文记录了SQLServer数据库磁盘满了的解... 目录问题解决方法删除数据库日志设置数据库日志大小问题今http://www.chinasem.cn天发

mysql主从及遇到的问题解决

《mysql主从及遇到的问题解决》本文详细介绍了如何使用Docker配置MySQL主从复制,首先创建了两个文件夹并分别配置了`my.cnf`文件,通过执行脚本启动容器并配置好主从关系,文中还提到了一些... 目录mysql主从及遇到问题解决遇到的问题说明总结mysql主从及遇到问题解决1.基于mysql

MySQL的索引失效的原因实例及解决方案

《MySQL的索引失效的原因实例及解决方案》这篇文章主要讨论了MySQL索引失效的常见原因及其解决方案,它涵盖了数据类型不匹配、隐式转换、函数或表达式、范围查询、LIKE查询、OR条件、全表扫描、索引... 目录1. 数据类型不匹配2. 隐式转换3. 函数或表达式4. 范围查询之后的列5. like 查询6

Linux下MySQL8.0.26安装教程

《Linux下MySQL8.0.26安装教程》文章详细介绍了如何在Linux系统上安装和配置MySQL,包括下载、解压、安装依赖、启动服务、获取默认密码、设置密码、支持远程登录以及创建表,感兴趣的朋友... 目录1.找到官网下载位置1.访问mysql存档2.下载社区版3.百度网盘中2.linux安装配置1.

PostgreSQL如何用psql运行SQL文件

《PostgreSQL如何用psql运行SQL文件》文章介绍了两种运行预写好的SQL文件的方式:首先连接数据库后执行,或者直接通过psql命令执行,需要注意的是,文件路径在Linux系统中应使用斜杠/... 目录PostgreSQ编程L用psql运行SQL文件方式一方式二总结PostgreSQL用psql运

SQL中的外键约束

外键约束用于表示两张表中的指标连接关系。外键约束的作用主要有以下三点: 1.确保子表中的某个字段(外键)只能引用父表中的有效记录2.主表中的列被删除时,子表中的关联列也会被删除3.主表中的列更新时,子表中的关联元素也会被更新 子表中的元素指向主表 以下是一个外键约束的实例展示

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

如何去写一手好SQL

MySQL性能 最大数据量 抛开数据量和并发数,谈性能都是耍流氓。MySQL没有限制单表最大记录数,它取决于操作系统对文件大小的限制。 《阿里巴巴Java开发手册》提出单表行数超过500万行或者单表容量超过2GB,才推荐分库分表。性能由综合因素决定,抛开业务复杂度,影响程度依次是硬件配置、MySQL配置、数据表设计、索引优化。500万这个值仅供参考,并非铁律。 博主曾经操作过超过4亿行数据