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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: 呕心沥血写了三天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);


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
存储 Ubuntu 关系型数据库
Ubuntu 20.04 卸载与安装 MySQL 5.7 详细教程
该文档提供了在Ubuntu上卸载和安装MySQL 5.7的步骤。首先,通过`apt`命令卸载所有MySQL相关软件包及配置。然后,下载特定版本(5.7.32)的MySQL安装包,解压并安装所需依赖。接着,按照特定顺序安装解压后的deb包,并在安装过程中设置root用户的密码。安装完成后,启动MySQL服务,连接数据库并验证。最后,提到了开启GTID和二进制日志的配置方法。
|
1月前
|
存储 关系型数据库 MySQL
【MySQL】在 Centos7 环境安装 MySQL -- 详细完整教程
【MySQL】在 Centos7 环境安装 MySQL -- 详细完整教程
|
2天前
|
关系型数据库 MySQL 数据库
使用ZIP包安装MySQL及配置教程
使用ZIP包安装MySQL及配置教程
17 4
|
4天前
|
关系型数据库 MySQL 数据库
MySQL mysqldump教程:轻松备份与迁移数据库
MySQL mysqldump教程:轻松备份与迁移数据库
|
12天前
|
关系型数据库 MySQL 数据库
MySQL8.0.36 安装配置教程(保姆级,包含图文讲解,环境变量的配置)适合小白
MySQL8.0.36 安装配置教程(保姆级,包含图文讲解,环境变量的配置)适合小白
|
16天前
|
SQL 关系型数据库 MySQL
Windows 10安装MySQL 5.7完整教程
Windows 10安装MySQL 5.7完整教程
58 2
|
18天前
|
关系型数据库 MySQL 数据库
Mysql—8.0.21下载安装配置教程
该教程介绍了MySQL的下载与安装步骤。建议从官网下载MySQL 8.0及以上版本,也可通过提供的百度网盘链接获取。解压后,在指定目录创建my.ini配置文件,并替换basedir和datadir为自己实际的安装路径。接着,将MySQL安装目录的bin文件夹添加到系统环境变量Path中。以管理员模式运行CMD,进入bin目录,使用`mysqld --initialize --console`初始化数据库,记下生成的临时密码。最后,用`net start mysql`启动服务,`mysql -u root -p`登录并使用ALTER指令修改初始密码。
90 1
|
25天前
|
SQL 存储 关系型数据库
MySQL数据库案例实战教程:数据类型、语法与高级查询详解
MySQL数据库案例实战教程:数据类型、语法与高级查询详解
36 3
|
10天前
|
存储 关系型数据库 MySQL
CentOS上安装MySQL 8.0的详细教程
CentOS上安装MySQL 8.0的详细教程
|
3天前
|
存储 关系型数据库 MySQL