1、新增外键(foreign key)
外键的定义
如果一张表中有一个字段(非主键)指向另外一张表的主键,那么将该字段称之为外键。其中,外键所在的表为从表,主键所在的表为主表,即外键所在的表称为主键所在的表的从表,从表受到主表的制约。
新增外键的方法
可以在创建表或者在创建好之后进行新增,但是要考虑到数据的问题,如果再创建表且表中已有数据之后新增,那么想要作为主键的字段中就不能有重复数据或者null。
新增外键的方法一: 创建表的时候增加外键
foreign key(外键字段) references 外部表(主键字段) [on 操作名(如update等) 约束模式名] ... [on 操作名(如update等) 约束模式名];
实例: 将c_id字段作为外键,其是依赖于外部表student表的主键
create table if not exists exp(
id int primary key auto_increment,
name varchar(10) not null comment '姓名',
c_id int comment '班级',
constraint 'c_id' foreign key(c_id) references student(id)
);
注: 外键要求字段(即为外键的那个字段)本身必须先是一个索引,才能创建外键,如果字段本身没有索引,外键会先创建一个索引,然后才会创建外键本身。
外键构成:
外键名字:constraint
外键字段:foreign key
外键引用:references
新增外键的方法二: 在新增表之后增加外键
alter table 表名 add [constraint 外键名字] foreign key(外键字段) references 副表(主键字段) [on 操作名(如update等) 约束模式名] ... [on 操作名(如update等) 约束模式名];
实例:
alter table my_foreign2
add constraint student_class_1
foreign key(c_id)
references my_class(id);
2、删除&修改主键
首先,需要说明的是,外键不能直接修改,只能先删除,然后再添加新的外键。
删除外键基本语法: alter table 表名 drop foreign key 外键名;
注: 一张表可以有多个外键,但是每个外键字段名不能重复; 再者,外键的删除通过查看表的结构是无法看到的,只能通过查看表的创建语句看到是否删除外键;最后,外键名不等于为外键的那个字段的字段名,如果自己已经设置外键名,那不用谈,如果默认外键名,通过show create table 表名;
即可查看外键的外键名。
新增外键的基本语法: alter table 表名 add foreign key(字段名) references 表名(主键字段);
实例: 将class表中的s_id字段设为外键,其依赖于student表的主键sno
alter table class add constraint s_id foreign key(s_id) references student(sno);
3、外键的约束作用
外键约束作用主要有两点,分别为:
1、子表数据进行写(增和改)操作的时候,如果对应的外键字段在副表找不到
对应的匹配,那么操作会失败(约束子表数据操作)
2、父表进行写操作(删和改,都必须涉及到主键本身),如果对应的主键在子表中
已经存在且已被数据所引用,那么就不允许操作(操作失败)
注: 需要注意的是,以上两点是外键默认的约束作用,可以通过一些参数修改这些默认约束(后面会说)。
4、外键存在并且起到作用的条件
外键存在并且起到作用的条件主要有四点:
1、外键要存在并且起到作用,首先必须保证表的存储引擎是innodb(默认的存储引擎);如果不是innodb引擎,只能成功创建外键,但是外键没有任何约束作用;
2、外键字段的类型必须与其所依赖的主键的类型保持一致;
3、一张表中,外键字段的名字不能重复;
4、增加外键的字段(该字段中已有数据),那么必须保证数据与父表主键要求对应,也就是说必须保证该字段所依赖的主键中的数据已经完全包含该字段中的数据。
5、外键的约束模式
外键约束的定义: 所谓外键约束,就是指外键的作用,之前所讲的外键的作用,是默认的作用,其实可以通过对外键的需求,进行定制操作;
具体的约束类型:
1、严格模式(默认的):用restrict关键字来实现,其具体的约束是父表不能删除或者更新一个已经被子类引用的记录(必须涉及到主键)。
2、级联模式:用cascade关键字实现,当删除一个数据时,如果该主键被其他表引用,那么就连其他表中引用该主键数据记录一块删除,对于更新等操作依次类推。
3、置空模式:用set null来实现,具体的效果是删除的时候子表置空;需要注意的是,此类型(模式)需要外键字段允许为空。
4、拒绝执行:用NO ACTION实现,InnoDB拒绝删除或者更新父表,当出现主键已被引用的情况。
各种约束模式的指定语法: alter table 表名 add [constraint 外键名字] foreign key(外键字段) references 副表(主键字段) [on 操作名(如update等) 约束模式名] ... [on 操作名(如update等) 约束模式名];
实例:
//将student表中的c_id设为外键,其依赖于class中的id,约束模式为默认
alter table student add foreign key(c_id) references class(id);
//删除student表中的外键
alter table student drop foreign key c_id;
//新增约束模式为set null的外键,其依赖和外键字段名不变
alter table student add constraint c_id foreign key(c_id) references class(id) on delete set null on update cascade;
//新增约束模式为cascade的外键,当更新时级联
alter table student add constraint c_id foreign key(c_id) references class(id) on update cascade;