呕心沥血写了三天3两夜24k字的MySQL详细教程(四)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 呕心沥血写了三天3两夜24k字的MySQL详细教程(四)

 

第六章 数据库约束


对表中的数据进行进一步的限制,保证数据的正确性、有效性和完整性。 约束种类:

PRIMARY KEY: 主键

UNIQUE: 唯一

NOT NULL: 非空

DEFAULT: 默认

FOREIGN KEY: 外键


6.1 主键


6.1.1 主键作用

用来唯一标识一条记录,每个表都应该有一个主键,并且每个表只能有一个主键。 有些记录的 name,age,score 字段的值都一样时,那么就没法区分这些数据,造成数据库的记录不唯一,这样就不方便管理数据   微信图片_20220525125805.png     哪个字段应该作为表的主键? 通常不用业务字段作为主键,单独给每张表设计一个id的字段,把id作为主键。主键是给数据库和程序使用的,不是给最终的客户使用的。所以主键有没有含义没有关系,只要不重复,非空就行。

6.1.2 创建主键


主键:PRIMARY KEY 主键的特点:


主键必须包含唯一的值


主键列不能包含NULL值


创建主键方式:


1. 在创建表的时候给字段添加主键


字段名 字段类型 PRIMARY KEY


2. 在已有表中添加主键 ALTER TABLE 表名 ADD PRIMARY KEY(字段名);


具体操作:创建表学生表st5, 包含字段(id, name, age)将id做为主键


CREATE TABLE st5 (
        id INT PRIMARY KEY, ‐‐ id是主键 NAME VARCHAR(20),
         age INT
);

微信图片_20220525125822.png

添加数据


INSERT INTO st5 (id, NAME) VALUES (1, '唐伯虎');
INSERT INTO st5 (id, NAME) VALUES (2, '周文宾');
INSERT INTO st5 (id, NAME) VALUES (3, '祝枝山');
INSERT INTO st5 (id, NAME) VALUES (4, '文征明');

插入重复的主键值


///

主键是唯一的不能重复:
Duplicate entry '1' for key 'PRIMARY'INSERT INTO st5 (id, NAME) VALUES (1, '文征明2');


插入NULL的主键值

主键是不能为空的:
Column 'id' cannot be nullINSERT INTO st5 (id, NAME) VALUES (NULL, '文征明3')


//


注意 : 一张表中只有一个主键 , 主键可以为多个字段 , 不过我们一般增减一个字段 id 来作为主键.


 6.1.3 删除主键


ALTER TABLE 表名 DROP PRIMARY KEY;


具体操作:删除st5表的主键


ALTER TABLE st5 DROP PRIMARY KEY;

微信图片_20220525125831.png   6.1.4 主键自增


主键如果让我们自己添加很有可能重复,我们通常希望在每次插入新记录时,数据库自动生成主键字段的值AUTO_INCREMENT 表示自动增长(字段类型是整型数字)


具体操作:创建学生表st6, 包含字段(id, name, age)将id做为主键并自动增长


/

CREATE TABLE st6 (
        id INT PRIMARY KEY AUTO_INCREMENT,
        NAME VARCHAR(20),
        age INT
);

插入数据


主键默认从1开始自动增长


INSERT INTO st6 (NAME, age) VALUES ('唐僧', 22);
INSERT INTO st6 (NAME, age) VALUES ('孙悟空', 26);
INSERT INTO st6 (NAME, age) VALUES ('猪八戒', 25);
INSERT INTO st6 (NAME, age) VALUES ('沙僧', 20);

微信图片_20220525130608.png

DELETE和TRUNCATE的区别

DELETE 删除表中的数据,但不重置AUTO_INCREMENT的值。

微信图片_20220525130614.png

TRUNCATE 摧毁表,重建表,AUTO_INCREMENT重置为1

TRUNCATE 摧毁表,重建表,AUTO_INCREMENT重置为1 

微信图片_20220525130622.png

6.2 唯一


在这张表中这个字段的值不能重复


6.2.1唯一约束


字段名 字段类型 UNIQUE


6.2.2 实现唯一约束


具体步骤:创建学生表st7, 包含字段(id, name),name这一列设置唯一约束,不能出现同名的学生


CREATE TABLE st7 (
         id INT,
        NAME VARCHAR(20) UNIQUE
);


  添加一个学生

INSERT INTO st7 VALUES (1, '貂蝉');
INSERT INTO st7 VALUES (2, '西施');
INSERT INTO st7 VALUES (3, '王昭君');
INSERT INTO st7 VALUES (4, '杨玉环');


/


‐‐ 插入相同的名字出现name重复: Duplicate entry '貂蝉' for key 'name'


INSERT INTO st7 VALUES (5, '貂蝉'); ‐‐ 出现多个null的时候会怎样?因为null是没有值,所以不存在重复的问题


INSERT INTO st3 VALUES (5, NULL);INSERT INTO st3 VALUES (6, NULL);


6.3 非空


这个字段必须设置值,不能是NULL


6.3.1 非空约束的基本语法格式


字段名 字段类型 NOT NULL


具体操作:创建表学生表st8, 包含字段(id,name,gender)其中name不能为NULL



/

CREATE TABLE st8 (
         id INT,
        NAME VARCHAR(20) NOT NULL, gender CHAR(2)
);


添加一条完整的记录


INSERT INTO st8 VALUES (1, '郭富城', '男');
INSERT INTO st8 VALUES (2, '黎明', '男');
INSERT INTO st8 VALUES (3, '张学友', '男');
INSERT INTO st8 VALUES (4, '刘德华', '男');
‐‐ 姓名不赋值出现姓名不能为null: Column 'name' cannot be null
INSERT INTO st8 VALUES (5, NULL, '男');


6.3.2 默认值


往表中添加数据时,如果不指定这个字段的数据,就使用默认值默认值格式 字段名 字段类型 DEFAULT 默认值


具体步骤:创建一个学生表 st9,包含字段(id,name,address), 地址默认值是广州


CREATE TABLE st9 (
        id INT,
         NAME VARCHAR(20), address VARCHAR(50) DEFAULT '广州'
)

添加一条记录,使用默认地址

INSERT INTO st9 (id, NAME) VALUES (1, '刘德华');

微信图片_20220525131444.png

添加一条记录,不使用默认地址

INSERT INTO st9 VALUES (2, '张学友', '香港');

第七章 表关系


7.1 表关系概念图


现实生活中,实体与实体之间肯定是有关系的,比如:老公和老婆,部门和员工,老师和学生等。那么我们在设计表的时候,就应该体现出表与表之间的这种关系!分成三种:


1. 一对一


2. 一对多


3. 多对多


7.2 一对多


对多(1:n) 例如:班级和学生,部门和员工,客户和订单,分类和商品 一对多建表原则: 在从表(多方)创建一个字段,指向主表(一方)的主键.我们把这个字段称之为外键.

微信图片_20220525131709.png


 7.3 多对多


多对多(m:n) 例如:老师和学生,学生和课程,用户和角色 多对多关系建表原则: 需要创建第三张表,中间表中至少两个字段,这两个字段分别作为外键指向各自一方的主键。

微信图片_20220525131716.png

7.4 一对(了解)


对一(1:1) 在实际的开发中应用不多.因为一对一可以创建成一张表。 两种建表原则:

外键唯一:主表的主键和从表的外键(唯一),形成主外键关系,

外键唯一UNIQUE外键是主键:主表的主键和从表的主键,形成主外键关系

微信图片_20220525131721.png

7.5 外键约束


7.5.1 什么是外键约束


一张表中的某个字段引用另一个表的主键 主表: 约束别人 副表/从表: 使用别人的数据,被别人约束微信图片_20220525131728.png


7.5.2 创建外键


1. 新建表时增加外键: [CONSTRAINT] [外键约束名称] FOREIGN KEY(外键字段名) REFERENCES 主表名(主键字段名)


关键字解释:


CONSTRAINT -- 约束关键字


FOREIGN KEY(外键字段名) –- 某个字段作为外键


REFERENCES -- 主表名(主键字段名) 表示参照主表中的某个字段


2.已有表增加外键: ALTER TABLE 从表 ADD [CONSTRAINT] [外键约束名称] FOREIGN KEY (外键字段名) REFERENCES 主表(主键字段名);


具体操作:以"新建表时添加外键"演示

‐ 先创建部门表
CREATE TABLE department (
        id INT PRIMARY KEY AUTO_INCREMENT,
        dep_name VARCHAR(20),
        dep_location VARCHAR(20)
        );
‐‐ 添加2个部门
INSERT INTO department (dep_name, dep_location) VALUES ('研发部', '广州'), ('销售部', '深圳');
‐‐ 然后创建员工表,添加外键约束
CREATE TABLE employee (
        id INT PRIMARY KEY AUTO_INCREMENT,
        NAME VARCHAR(20),
        age INT, dep_id INT,
        ‐‐ 添加一个外键 ‐‐ 外键取名公司要求,一般fk结尾 CONSTRAINT         emp_depid_ref_dep_id_fk FOREIGN KEY(dep_id) REFERENCES department(id)
);

正常添加数据

INSERT INTO employee (NAME, age, dep_id) VALUES('张三', 20, 1),('李四', 21, 1),('王五', 20, 1),('老王', 20, 2),('大王', 22, 2),('小王', 18, 2);

部门错误的数据添加失败


INSERT INTO employee (NAME, age, dep_id) VALUES ('二王', 20, 5);


7.5.3 删除外键(了解)


ALTER TABLE 从表 drop foreign key 外键名称;


具体操作:删除employee表的emp_depid_ref_dep_id_fk外键


ALTER TABLE employee DROP FOREIGN KEY emp_depid_ref_dep_id_fk;


在employee表情存在况下添加外键


ALTER TABLE employee ADD CONSTRAINT emp_depid_ref_dep_id_fk FOREIGN KEY(dep_id) REFERENCES department(id);


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
26天前
|
NoSQL Java 关系型数据库
Liunx部署java项目Tomcat、Redis、Mysql教程
本文详细介绍了如何在 Linux 服务器上安装和配置 Tomcat、MySQL 和 Redis,并部署 Java 项目。通过这些步骤,您可以搭建一个高效稳定的 Java 应用运行环境。希望本文能为您在实际操作中提供有价值的参考。
119 26
|
5月前
|
关系型数据库 MySQL Java
centos7安装mysql教程及Navicat平替软件
【8月更文挑战第17天】本教程详述CentOS 7上安装MySQL的过程。首先确保移除任何预装的MySQL组件,然后通过wget获取并安装MySQL的YUM源。可以选择安装特定版本如5.7或8.0。安装MySQL服务器后,启动服务并查找初始密码。登录MySQL后应立即更改密码,并可根据需要设置远程访问权限。此外,还推荐使用免费开源的DBeaver作为数据库管理工具,提供了安装步骤以方便管理和操作MySQL数据库。
179 3
|
2月前
|
关系型数据库 MySQL Java
Servlet+MySQL增删改查 原文出自[易百教程] 转载请保留原文链接: https://www.yiibai.com/geek/1391
对于任何项目开发,创建,读取,更新和删除(CRUD)记录操作是应用程序的一个最重要部分。
69 20
|
3月前
|
存储 SQL 关系型数据库
【入门级教程】MySQL:从零开始的数据库之旅
本教程面向零基础用户,采用通俗易懂的语言和丰富的示例,帮助你快速掌握MySQL的基础知识和操作技巧。内容涵盖SQL语言基础(SELECT、INSERT、UPDATE、DELETE等常用语句)、使用索引提高查询效率、存储过程等。适合学生、开发者及数据库爱好者。
74 0
【入门级教程】MySQL:从零开始的数据库之旅
|
3月前
|
tengine 关系型数据库 MySQL
Tengine、Nginx安装MySQL数据库命令教程
本指南详细介绍了在Linux系统上安装与配置MySQL数据库的步骤。首先通过下载并安装MySQL社区版本,接着启动MySQL服务,使用`systemctl start mysqld.service`命令。若启动失败,可尝试使用`sudo /etc/init.d/mysqld start`。利用`systemctl status mysqld.service`检查MySQL的服务状态,确保其处于运行中。通过日志文件获取初始密码,使用该密码登录数据库,并按要求更改初始密码以增强安全性。随后创建一个名为`tengine`的数据库,最后验证数据库创建是否成功以及完成整个设置流程。
|
5月前
|
SQL 关系型数据库 MySQL
PHP与MySQL交互之基础教程
【8月更文挑战第31天】 在数字世界中,数据是推动一切的核心力量。本文将引导你探索PHP与MySQL的协同工作,通过实际代码示例,展示如何建立连接、执行查询以及处理结果集。无论你是初学者还是希望巩固知识的开发者,这篇文章都将为你提供宝贵的实践知识。
|
5月前
|
关系型数据库 MySQL 网络安全
MySQL主从复制详细教程
配置MySQL的主从复制是一个细致的过程,需要仔细遵循上述步骤进行。一旦配置完成并运行正常,主从复制将大大提高数据库的可用性和读写性能。在操作过程中,务必保持谨慎,确保数据的一致性和安全性。
521 0
|
6月前
|
关系型数据库 MySQL Linux
Docker安装mysql详细教程, mysqld: Can‘t read dir of ‘/etc/mysql/conf.d/‘(报错已解决)
Docker安装mysql详细教程, mysqld: Can't read dir of '/etc/mysql/conf.d/' (Errcode: 2 - No such file or directory) 已解决
|
6月前
|
SQL Oracle 关系型数据库
MySQL、SQL Server和Oracle数据库安装部署教程
数据库的安装部署教程因不同的数据库管理系统(DBMS)而异,以下将以MySQL、SQL Server和Oracle为例,分别概述其安装部署的基本步骤。请注意,由于软件版本和操作系统的不同,具体步骤可能会有所变化。
425 3
|
6月前
|
存储 关系型数据库 MySQL
MySQL小白教程(进阶篇):数据管理与高级查询
MySQL小白教程(进阶篇):数据管理与高级查询