约束
-
概念:就是用来作用表中字段的规则,用于限制存储在表中的数据。
-
目的:保证数据库中数据的正确性,有效性和完整性。
-
约束演示
#定义一个学生表,表中要求如下: #sn 表示学生学号,要求使用 int 类型,主键并且自动递增; #name 表示姓名,不为空; #age 表示年龄,18-30岁之间; #gender 表示性别; #study_status 表示学习状态,0表示挂科,1表示通过,默认是 1 CREATE TABLE student( sn int AUTO_INCREMENT PRIMARY KEY, name varchar(10) not null, age int check(age >= 18 && age <=30), gender char(1), study_status TINYINT DEFAULT 1 )COMMENT '学生表'; SELECT * FROM student; #添加一点学生数据 insert into student (name,age,gender,study_status) values('sy',18,'男',1); insert into student (name,age,gender,study_status) values('sy',18,'男',1); insert into student (name,age,gender,study_status) values(null,18,'男',1); insert into student (name,age,gender,study_status) values('sy',31,'男',1); insert into student (name,age,gender) values('werewr',30,'男');
外键约束
-
概念:用户建立两张表之间的联系的,为了保证数据的一致性和完整性的。
-
注意上面创建的时候没有使用外键真正的来管理数据,可能会存在数据的丢失
-
添加外键(主表就是数据不能随意改变的表)
1.创建表创建外键 CREATE TABLE 表名( 字段名 数据类型, ... [CONSTRAINT] [外键名称] FOREIGN KEY (外键字段名) REFERENCES 主表 (主表列名) ); 2.添加外键 ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCES 主表 (主表列名) ;
-
案例:为emp表的dept_id字段添加外键约束,关联department表的主键id
alter table emp add constraint fk_emp_dept_id FOREIGN key (dept_id) REFERENCES department(id);
-
-
删除外键
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
-
案例:删除刚才添加的外键
ALTER TABLE emp DROP FOREIGN KEY fk_emp_dept_id;
-
-
删除更新外键
-
添加了外键之后尼,再删除父表数据时产生约束行为,就称为删除和更新行为。
-
语法
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段) REFERENCES 主表名 (主表字段名) ON UPDATE CASCADE ON DELETE CASCADE;
-
案例:CASCADE(父表会删除或者更新子表中的外键数据)
ALTER TABLE emp add constraint fk_emp_dept_id FOREIGN KEY (dept_id) REFERENCES department(id) on update cascade on delete cascade;
-
案例:SET NULL
ALTER TABLE emp add constraint fk_emp_dept_id FOREIGN KEY (dept_id) REFERENCES department(id) ON UPDATE SET NULL ON DELETE SET NULL;
-
一对一关系
-
用户和用户详情
-
关系:一对一的关系
-
用途:用于单表拆分,将一张表的基础字段放在一张表中,其它字段放在另一张表中,可以提升查询效率
-
实现:在任意一张表里面添加外键,关联另一张表的主键
CREATE TABLE `user_detail` ( `id` int NOT NULL AUTO_INCREMENT, `university` varchar(255) DEFAULT NULL, `car` varchar(255) DEFAULT NULL, `hourse` varchar(255) DEFAULT NULL, `user_id` int NOT NULL UNIQUE, // 唯一约束 PRIMARY KEY (`id`) USING BTREE, KEY `u_id` (`user_id`), CONSTRAINT `u_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
一对多关系
-
案例:部门和员工关系
-
关系:一个部门对应多个员工,一个员工对应一个部门
-
实现:在多的一方建立外键,指向一的一方的主键
多对多的关系
-
案例:角色和菜单的关系,学生和老师
-
关系:一个学生可以有多个老师,一个老师可以有多个学生
-
实现:建立三方表,中间表来包含两个表的主键(需要创建中间表)