1 外键
- 外键:foreign key,外面的键(键不在自己表中),如果一张表中有一个字段(非主键)指向另外一张表的主键,那么将该字段称为外键。
1.1 增加外键
- 外键可以在创建表的时候或创建表之后增加(但是要考虑数据的问题)。
- 方案一:在创建表的时候增加外键,在所有的表字段之后,使用foreign key(外键字段) references 外部表 (主键字段);
-- 创建班级 CREATE TABLE my_class( id INT PRIMARY KEY AUTO_INCREMENT, c_name VARCHAR(20) NOT NULL, room VARCHAR(20) ); -- 创建学生表 CREATE TABLE my_student1( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20) NOT NULL, c_id INT , CONSTRAINT fk_c_id FOREIGN KEY (c_id) REFERENCES my_class (id) );
- 方案二:在新增表之后,增加外键,所以需要修改表结构。
alter table 表名 add [constraint 外键名字] foreign key (外键字段) references 父表(主键字段);
-- 创建班级 CREATE TABLE my_class( id INT PRIMARY KEY AUTO_INCREMENT, c_name VARCHAR(20) NOT NULL, room VARCHAR(20) ); -- 创建学生表 CREATE TABLE my_student2( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20) NOT NULL, c_id INT ); ALTER TABLE my_student2 ADD CONSTRAINT fk_c_id FOREIGN KEY (c_id) REFERENCES my_class (id);
1.2 修改外键&删除外键
- 外键不可以修改:只能先删除后新增。
alter table 表名 drop foreign key 外键名;--一张表中可以有多个外键,但是名字不能相同
ALTER TABLE my_student2 DROP FOREIGN KEY fk_c_id;
1.3 外键作用
- 外键默认的作用有两点:
- 一个对父表:父表数据进行写操作(删和改,都必须设计到主键本身),如果对应的主键在字表中已经被数据所引用,那么就不允许操作。
- 一个对字表(外键字段所在的表):字表数据进行写操作(增和改)的时候,如果对应的外键字段在父表找不到对应的匹配,操作会失败。
1.4 外键条件
- 外键要存在:首先必须表的存储引擎是innodb。如果不是innodb存储引擎,那么外键可以创建成功,但是没有约束效果。
- 外键字段的字段类型(列类型)必须和父表的主键类型完全一致。
- 一张表中的外键名字不能重复。
- 增加外键的字段(数据已经存在),必须保证数据和父表主键要求对应。
1.5 外键约束
- 外键约束:就是外键的作用。
- 外键约束有三种约束模式:都是针对父表的约束
- district:严格模式(默认的),父表不能删除或更新一个已经被子表数据引用的记录(主键)。
- cascade:级联模式,父表的操作,对应子表关联的数据也随之变化。
- set null:置空模式,父表的操作之后,子表对应的数据(外键)被置空。
- 通常:父表删除的时候,子表置空;更新的时候,子表级联操作。
constraint 外键名字 foreign key (外键字段) references 主表(主键) on delete set null;
constraint 外键名字 foreign key (外键字段) references 主表(主键) on update cascade;
constraint 外键名字 foreign key (外键字段) references 主表(主键) on delete set null on update cascade;
- 删除置空的前提:外键字段为空(如果不满足条件,外键无法创建)。
- 外键虽然很强大,能够进行各种约束,但是对于java来说,外键约束降低了java对数据的可控性。所以,通常情况下,在实际开发中,很少使用外键的级联模式和置空模式。
2 联合查询
时间: 2024-10-22 11:19:41