一、MySQL的数据类型
1.MySQL的数据类型
2.常见的数据类型的属性
二、整数类型
三、浮点类型
REAL默认就是DOUBLE。如果你把SQL模式设定为启用“REAL_AS_FLOAT”,那么,MySQL就认为REAL是FLOAT。如果要启用“REAL_AS_FLOAT”,可以通过以下SQL语句实现:
SET sql_mode = "REAL_AS_FLOAT";
四、约束
4.1 为什么需要约束
数据完整性(Data Integrity)是指数据的精确性(Accuracy)和可靠性(Reliability)。它是防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信息而提出的,而约束就是为了保证数据的完整性
约束就是对表中字段的限制
实体完整性(Entity Integrity):例如,同一个表中,不能存在两条完全相同无法区分的记录
域完整性(Domain Integrity):例如:年龄范围0-120,性别范围“男/女”
引用完整性(Referential Integrity):例如:员工所在部门,在部门表中要能找到这个部门
用户自定义完整性(User-defined Integrity):例如:用户名唯一、密码不能为空等,本部门经理的工资不得高于本部门职工的平均工资的5倍。
约束的分类:
1.从约束字段的字段的个数分为 单列约束和多列约束
2.约束的作用范围分为 列级约束和表级约束
列级约束:将此约束声明在对应字段的后面
表级约束:在表中所有字段
约束的作用:
NOT NULL 非空约束
UNIQUE 唯一性约束
PRIMARY KEY 主键约束
FOREIGN KEY 外键约束
CHECK 检查约束
DEFAULT 默认值约束
添加约束的场景
CREATE TABLE 时添加约束
ALTER TABLE 时添加约束
如何查看表中的约束
SELECT *
FROM information_schema.table_constraints # 数据库内置的表
WHERE table_name = 'emp1'; # 之前的属于固定查询,这一句是进行匹配
4.2 非空约束
在创建表时添加约束
CREATE TABLE test1(
id INT NOT NULL,
name VARCHAR(255) NULL,
salary DECIMAL(10,2)
)
在 ALTER TABLE时添加约束
ALTER TABLE test1
MODIFY name VARCHAR(255) NOT NULL;
删除非空约束
就相当于修改约束使其没有限制
ALTER TABLE test1
MODIFY name VARCHAR(255) NOT NULL;
4.3 唯一约束性
UNIQUE 约束列中的内容不能重复
在创建时添加约束
CREATE TABLE test2(
id INT UNIQUE, # 列级约束
name VARCHAR(255),
garden TINYINT,
# 表级约束
CONSTRAINT uk_test2_name UNIQUE(name) # 或unique(name)
)
# 查看约束
SELECT *
FROM information_schema.table_constraints # 数据库内置的表
WHERE table_name = 'test2';
补充:
(1)表级约束:NOT NULL 没有表级约束;CONSTRAINT 意思是 约束
(2)在创建唯一约束的时候,如果不给唯一约束命名,就默认和列名相同
(3)可以向声明unique的字段上添加NULL值,而且可以多次添加
在 ALTER TABLE时添加约束
ALTER TABLE test2
ADD CONSTRAINT new UNIQUE(name) # 对约束条件进行约束,并对约束进行命名
# ADD UNIQUE(name) 直接添加
# 或
/*
ALTER TABLE test2
MODIFY name VARCHAR(255) UNIQUE
*/SELECT *
FROM information_schema.table_constraints # 数据库内置的表
WHERE table_name = 'test2';
复合的唯一性约束
对于复合的唯一性约束,只要这两个不完全相同即可
CREATE TABLE USER(
id INT,
name VARCHAR(255),
password VARCHAR(255),
# 表级约束
UNIQUE(name,password)
)# 例:
INSERT INTO USER
VALUES(1,'a','abc'),
(2,'b','abc')
删除唯一性
(1) 添加唯一性约束的列上也会自动创建唯一索引
(2) 删除唯一约束只能通过删除唯一索引的方式删除
(3) 删除时需要指定唯一索引名,唯一索引名就和唯一约束名一样。
(4) 如果创建唯一约束时未指定名称,如果是单列,就默认和列名相同;如果是组合列,那么默认和()中排在第一个的列名相同,也可以自定义唯一约束名
4.4 主键约束
PRIMARY KEY 这就好使主键不能为空,必须有值
在 CREATE TABLE 时添加约束
CREATE TABLE test3(
id INT PRIMARY KEY,
name VARCHAR(255),
salary DECIMAL(10,2),
email VARCHAR(255)
);
# 或
CREATE TABLE test5(
id INT,
name VARCHAR(255),
PRIMARY KEY(id)
);SELECT *
FROM information_schema.table_constraints # 数据库内置的表
WHERE table_name = 'test5';
在 ALTER TABLE 时添加约束
此时只能是在这个表没有主键约束时才可以
ALTER TABLE test5
ADD PRIMARY KEY (id)
删除主键约束
因为一个表只有一个主键,所以删除时,不需要指定名称,所以删除很好进行
ALTER TABLE test5
DROP PRIMARY KEY
五、自增变量的持久化
自增列:
首先我们要引入自增列的概念,就比如学号列,如果你设置为了自增列,那么每增加一个学生,它就会自动向后顺延一个学号
CREATE TABLE test7(
id INT auto_increment PRIMARY KEY, # 创建一个自增列
name VARCHAR(255) UNIQUE
)
SELECT *FROM test7;
INSERT INTO test7(name)
VALUES('Tom'),('Mike')
SELECT *FROM test7;
INSERT INTO test7
VALUES(NULL,'people')
SELECT *FROM test7;
补充:
(1)当我们没有指明字段就进行添加时,含有auto_increment的列会自己进行自增;
(2)当我们向含有auto_increment的字段添加0或null时,也会自动进行自增
随后我们通过一个主表和从表来展现一下基本操作
外键约束
在create table 时添加
# 主表和从表:父表和子表
先创建主表
CREATE TABLE deep(
id INT,
name VARCHAR(155)
);
创建从表
CREATE TABLE dee(
dee_id INT PRIMARY KEY auto_increment,
dee_name VARCHAR(155),
department_id INT,
# 表级约束
FOREIGN KEY(dee_id) REFERENCES deep(id)
);
# 需要注意的是主表中的id也需要有主键约束或唯一性约束,才能与从表建立联系
ALTER TABLE deep
ADD PRIMARY KEY (id);
我们再来了解一下约束的等级
cascade方式:在父表上更新删除记录,同步更新删除子表的匹配记录
Set null模式:父表上已经更新或删除记录时,将子表上匹配记录的列的位置设为null
no action方式:如果子表中有匹配记录,则不允许对主表进行更新删除操作
restrict方式:如果子表中有匹配的记录,则不允许对父表对应候选键进行更新删除操作
restrict方式:同no action
set default方式:父表有变更时,子表相应的设置成一个默认的值,但是lnnodb不能识别
随后我们以ON UPDATE CASCADE ON DELETE SET NULL来进行一次演示:
先创建主表
CREATE TABLE dept(
id INT PRIMARY KEY,
name VARCHAR(155)
);
创建从表
CREATE TABLE de(
de_id INT PRIMARY KEY auto_increment,
de_name VARCHAR(155),
department_id INT,
# 表级约束
FOREIGN KEY(department_id) REFERENCES dept(id) ON UPDATE CASCADE ON DELETE SET NULL
# 把修改操作设置为级联修改等级,把删除操作设置为set null等级
# 注意:不能将不能为空的列作为修改对象
);INSERT INTO dept
VALUES(1001,'教学部'),
(1002,'学习部'),
(1003,'公关部')INSERT INTO de
VALUES(1,'张三',1001),
(2,'李四',1001),
(3,'王五',1003),
(4,'尔玛',1002)


我们先建立起主表与从表的联系,然后对主表进行修改,观察从表的变化
UPDATE dept
SET id = 1004
WHERE id = 1002
SELECT *
FROM de,dept
where de.department_id = dept.id


当我们修改主表时,从表中与之关联的列也同步发生变化
DELETE FROM dept
WHERE id = 1002
此时尔玛的department_id 为null
最后我们还需要注意删除外键约束,因为在当初建立约束时,就自动产生了约束索引
不过我们还需要注意:由于在当初建表的时候,没有为这个外键约束起一个名称,所以 MySQL 为此自动生成了一个名称,这个自动生成的名称不同于受到这个外键约束的列名。而删除外键的时候,需要提供的是这个外键约束名,而不是列名,所以需要先查找出外键的名称,然后才能将其删除
为了查看外键的名称,我们需要用到 show create TABLE de,并将其复制出来
CREATE TABLE `de` (`de_id` int NOT NULL AUTO_INCREMENT,`de_name` varchar(155) DEFAULT NULL,`department_id` int DEFAULT NULL,PRIMARY KEY (`de_id`),KEY `department_id` (`department_id`),CONSTRAINT `de_ibfk_1` FOREIGN KEY (`department_id`) REFERENCES `dept` (`id`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
我们可以看到外键的名称:CONSTRAINT `de_ibfk_1` FOREIGN KEY (`department_id`) REFERENCES `dept` (`id`) ON DELETE SET NULL ON UPDATE CASCADE
被命名为了 de_ibfk_1 ,因此我们删除时也要通过这个进行删除
# 删除外键约束
ALTER TABLE de
DROP FOREIGN KEY de_ibfk_1
# 检查删除的外键约束是否有对应的普通索引
SHOW INDEX FROM de # 通过这一步找到Column_name 中,对应的我们所删除的字段名称
# 删除索引
ALTER TABLE de
DROP INDEX department_id # key name即外键的约束名
从而实现对外键及其索引的完整性删除
六、结语
永远相信自己;一往无前,风雨无阻
须知少日拏云志,曾许人间第一流。我们还年轻,我们还有无限可能!