Mysql的5中外键约束方式

版权声明:本文为博主原创文章,欢迎转载,转载请注明作者、原文超链接,博主地址: https://blog.csdn.net/GRAY_KEY/article/details/86752253

何为外键?

如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为子表(从表)。【注:两个表必须是InnoDB表,MyISAM表暂时不支持外键】

外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以;

精辟:

当删除子表时,主表是不会受到影响的;而当删除主表时,子表可能会受到影响。

因为因为外键关联是设置在子表的,也就是说子表纯粹是一厢情愿的事,子表是死是活,跟主表一毛钱关系没有。

 

外键的作用:

外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是修改或者删除的级联操作将使得日常的维护工作更加轻松。

5种外键约束方式的区别

  • cascade方式(级联方式)

在父表上update/delete记录时,同步update/delete掉子表的匹配记录 

  • set null方式

在父表上update/delete记录时,将子表上匹配记录的列设为null

注意:子表的外键列不能为not null  

  • no action方式

如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作(操作会失败,即不做任何操作)

  • restrict方式

效果同no action,两者在mysql中,都是立即检查外键约束

  • set default方式

父表有变更时,子表将外键列设置成一个默认的值 但Innodb目前不能识别

以下是代码示例:

  部门表(主表)

create table if not exists department (

    id int(11) primary key auto_increment,

    name varchar(32) not null
);

  用户表(子表 / 从表)

create table if not exists user (

    id int(11) primary key auto_increment,

    name varchar(32) not null,

    did int(11),

    --添加外键约束(将 主表department中的主键id 与 本表的字段did 关联起来, 本表字段did 将作为外键存在)
    constraint fk_did foreign key(did) references department(id)
);

【 fk_did:是外键约束名称;did:是本表的外键字段; department(id):是关联的主表(主键)】

  注:mysql中新建的外键约束默认的约束方式是 restrict

从以下的ER图表,可以看出两张表的联系

若在新建表的时候忘记添加外键约束,没有关系,可以在表已存在的情况下通过修改表来添加外键约束:

create table if not exists user1 (

    id int(11) primary key auto_increment,

    name varchar(32) not null,

    did int(11)
);

--通过修改表来 添加外键约束
alter table user1 add constraint fk1_did foreign key(did) references department(id);

【 fk_did:是外键约束名称;did:是本表的外键字段; department(id):是关联的主表(主键)】

当然,对于已存在外键约束的表,也可通过修改表来删除外键约束:

alter table user1 drop foreign key fk1_did;

【fk1_did:外键约束名称】

在添加外键约束的时候,其实也可以指定约束方式:

alter table user1 add constraint fk1_did foreign key(did) references department(id)

on delete cascade on update set null;

不同外键约束方式的效果体现,具体示例可参考下文:

https://blog.csdn.net/u012865381/article/details/80092758

猜你喜欢

转载自blog.csdn.net/GRAY_KEY/article/details/86752253