MySQL笔记: 关于约束条件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
-- 数据表字段的添加约束条件

-- 1. 主键约束 PRIMARY KEY
-- 唯一标识数据表中记录的字段
-- [例]
-- 创建一个学生表students(学号 主键,姓名,年龄);
DROP TABLE students;
-- CREATE TABLE students(stuId INT,stuName VARCHAR(20),stuAge INT);
CREATE TABLE students(stuId INT PRIMARY KEY,stuName VARCHAR(20),stuAge INT);
DESC students;

INSERT INTO students VALUES(1,'张三',18);
INSERT INTO students VALUES(1,'李四',20);-- 提示错误
SELECT * FROM students;

-- 2. 默认值约束 DEFAULT
-- 插入数据没有提供该列字段数据时使用默认值填充
-- [例]
-- 创建一个学生表(学号,姓名,年龄 默认18岁);
DROP TABLE students;
CREATE TABLE students(stuId INT,stuName VARCHAR(20),stuAge INT DEFAULT 18);

INSERT INTO students VALUES(1,'张三',17);
INSERT INTO students VALUES(2,'李四',NULL);
INSERT INTO students(stuId,stuName) VALUES(3,'王五'); -- 没有提供数据,所以会是默认值
SELECT * FROM students;

-- 3. 非空约束
-- 限制插入数据时必须为该字段提供非空数据
-- [例]
-- 创建一个学生表(学号,姓名 非空,年龄);
DROP TABLE students;
CREATE TABLE students(stuId INT,stuName VARCHAR(20) NOT NULL,stuAge INT DEFAULT 18);

INSERT INTO students VALUES(1,NULL,17);

-- 4. 唯一约束
-- 所有行的数据该列不能有同值
-- [例]
-- 创建部门表(部门id,部门名称 唯一)

DROP TABLE dept;
CREATE TABLE dept(id INT,deptName VARCHAR(20) UNIQUE);

INSERT INTO dept VALUES (1,'工程部');
INSERT INTO dept VALUES (2,'销售部');
INSERT INTO dept VALUES (3,'工程部'); -- 插入不进去了
SELECT * FROM dept;

-- 5. 自增长约束 auto_increment
-- 该字段不需要赋值,数值会自动增长
DROP TABLE students;
CREATE TABLE students(sid INT PRIMARY KEY AUTO_INCREMENT,stuName VARCHAR(20),stuAge INT);
INSERT INTO students(stuName,stuAge) VALUES('张三',17);
INSERT INTO students(stuName,stuAge) VALUES('李四',NULL);
INSERT INTO students(stuName,stuAge) VALUES('王五',17);
INSERT INTO students(stuName,stuAge) VALUES('赵六',19);
SELECT * FROM students;

DELETE FROM students WHERE sid = 3;

DELETE FROM students; -- 只会删除数据,不会清楚自动增长的序号
TRUNCATE TABLE students; -- 清空数据,并充值自动增长的序号

DESC students;

-- 6. 外键约束
-- 约束两张表的数据

-- dept 主表
DROP TABLE dept;
CREATE TABLE dept(id INT PRIMARY KEY,departName VARCHAR(20));
INSERT INTO dept VALUES(1,'工程部');
INSERT INTO dept VALUES(2,'销售部');
INSERT INTO dept VALUES(3,'客服部');

-- employee 是副表 employee的deptId依赖dept表中的id
DROP TABLE employee;
CREATE TABLE employee(
id INT,
empName VARCHAR(20),
deptId INT,
-- 添加一个外键约束
CONSTRAINT employee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id)
-- 约束名字 本表字段 外表字段
ON UPDATE CASCADE -- 级联修改
ON DELETE CASCADE -- 级联删除
);

DELETE FROM employee;
-- 插入数据
INSERT INTO employee VALUES(1,'张三',1);
INSERT INTO employee VALUES(2,'李四',1);
INSERT INTO employee VALUES(3,'王五',1);
INSERT INTO employee VALUES(4,'乔布斯',3);
INSERT INTO employee VALUES(5,'比尔盖茨',2);
INSERT INTO employee VALUES(6,'克林顿',2);
INSERT INTO employee VALUES(7,'小布什',4);
-- 插入不进去了,因为添加了外键约束 没有4的部门
-- Cannot add or update a child row: a foreign key constraint fails (`xxxcompany`.`employee`, CONSTRAINT `employee_dept_fk` FOREIGN KEY (`deptId`) REFERENCES `dept` (`id`))
-- INSERT INTO employee VALUES(7,'小布什',3);
SELECT * FROM employee;

-- 修改数据
UPDATE employee SET deptId = 5 WHERE id = 7; -- 修改不了. 因为外键约束

-- 级联操作问题:

-- 如果没有添加级联操纵,如果我要删除dept里的工程部,删不掉,因为第二张表里需要这条数据
-- 怎么解决? 为副表添加级联操作
UPDATE dept SET id = 5 WHERE id = 3; -- employee 中的deptId 也更正修改
DELETE FROM dept WHERE id = 1; -- employee 中的工程部人员也全部被删除
文章目录