mysql(四) MySQL外键设置操作

外键作为表与表之间关联的字段,主要用来保证数据的完整性和一致性。就像下面的两表ORGID 就是两表的关联字段。

A表

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) //主键自增
    //@GenericGenerator(name="system-id", strategy = "uuid.hex")
    @Column(name = "USERID")
    private int userId;
    @Column(name = "USERNAME")
    private String userName;
    @Column(name = "SEX")
    private int sex;
    @Column(name = "DEGEREE")
    private Double degeree;
    @Column(name = "ORGID")

B表

    @Id
    @Column(name = "ORGID")
    private int orgId;
    @Column(name = "OEGNAME")
    private String orgName;
    @Column(name = "ORGDEGREE")
    private Double orgDegree;

(一)父子表区分

首先明确一个概念,假如表A(USERID,USERNAME,SEX,DEGEREE,ORGID),表B(ORGID,OEGNAME,ORGDEGREE),我们说表A参考了表B的主键作为其外键使用,所以B表示父表,A表是子表

(二)删除和更新有四种设置方式

(1)cascade:级联,当父表(B表)更新、删除,子表(A表)会同步更新和删除,如果字表删除,更新,则只会影响字表,对父表不做更改。新增时父表有关联数据 子表才能新增,但是外键选择只能在主表里面选。单纯只增加某一张表是不行的。
(2)set null:置空,当父表更新、删除的时候,字表会把外键字段变为null,所以这个时候设计表的时候该字段要允许为null,否则会出错
(3)restrict:父表在删除和更新记录的时候,要在子表中检查是否有有关该父表要更新和删除的记录,如果有,则不允许删除或更改
(4)no action:和restrict一样

(三)具体创建

两个表必须是InnoDB表,MyISAM表暂时不支持外键
外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显示建立;
外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以;

1:外键约束使用最多的两种情况:

如果想达到父表更新时子表也更新,父表删除时如果子表有匹配的项,删除失败;则:

在外键定义中,我们使用ON UPDATE CASCADE ON DELETE RESTRICT;

父表更新时子表也更新,父表删除时子表匹配的项也删除;则:

可以使用ON UPDATE CASCADE ON DELETE CASCADE。

article 子表

CREATE TABLE IF NOT EXISTS article (
id int(11) NOT NULL AUTO_INCREMENT,
category_id int(11) NOT NULL,
name char(16) NOT NULL,
#主键
PRIMARY KEY (id),
#KEY为索引。 fk_1为起了一个名字
KEY fk_1 (category_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2;

category 父表

CREATE TABLE IF NOT EXISTS category (
id int(11) NOT NULL AUTO_INCREMENT,
name char(16) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2;

2:创建外键约束(fk_2只是起了一个名字而已。上面两表article 为子表):

ALTER TABLE article ADD CONSTRAINT fk_2 FOREIGN KEY (category_id)
REFERENCES category (id)
ON DELETE CASCADE ON UPDATE CASCADE

如果子表试图创建一个在父表中不存在的外键值,InnoDB会拒绝任何INSERT或UPDATE操作。如果父表试图UPDATE或者DELETE任何子表中存在或匹配的外键值,最终动作取决于外键约束定义中的ON UPDATE和ON DELETE选项。InnoDB支持5种不同的动作,如果没有指定ON DELETE或者ON UPDATE,默认的动作为RESTRICT:

在这里插入图片描述

3:删除外键

ALTER TABLE article DROP FOREIGN KEY fk_2
发布了246 篇原创文章 · 获赞 12 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_41987908/article/details/105468111
今日推荐