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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章