站長資訊網
        最全最豐富的資訊網站

        mysql中如何設置外鍵約束?

        mysql中設置外鍵約束的方法:可以通過FOREIGN KEY關鍵字來指定外鍵,語法“ALTER TABLE 表名 ADD CONSTRAINT 外鍵名 FOREIGN KEY(列名) REFERENCES 主表名 (列名);”。

        mysql中如何設置外鍵約束?

        (推薦教程:mysql視頻教程)

        (1) 外鍵的使用:

        外鍵的作用,主要有兩個:
        一個是讓數據庫自己通過外鍵來保證數據的完整性和一致性
        一個就是能夠增加ER圖的可讀性
        有些人認為外鍵的建立會給開發時操作數據庫帶來很大的麻煩.因為數據庫有時候會由于沒有通過外鍵的檢測而使得開發人員刪除,插入操作失敗.他們覺得這樣很麻煩
        其實這正式外鍵在強制你保證數據的完整性和一致性.這是好事兒.
        例如:
        有一個基礎數據表,用來記錄商品的所有信息。其他表都保存商品ID。查詢時需要連表來查詢商品的名稱。單據1的商品表中有商品ID字段,單據2的商品表中也有商品ID字段
        。如果不使用外鍵的話,當單據1,2都使用了商品ID=3的商品時,如果刪除商品表中ID=3的對應記錄后,再查看單據1,2的時候就會查不到商品的名稱。
        當表很少的時候,有人認為可以在程序實現的時候來通過寫腳本來保證數據的完整性和一致性。也就是在刪除商品的操作的時候去檢測單據1,2中是否已經使用了商品ID為3的商
        品。但是當你寫完腳本之后系統有增加了一個單據3 ,他也保存商品ID找個字段。如果不用外鍵,你還是會出現查不到商品名稱的情況。你總不能每增加一個使用商品ID的字段的單據時就回去修改你檢測商品是否被使用的腳本吧,同時,引入外鍵會使速度和性能下降。

        (2) 添加外鍵的格式:
        ALTER TABLE yourtablename
        ADD [CONSTRAINT 外鍵名] FOREIGN KEY [id] (index_col_name, …)
        REFERENCES tbl_name (index_col_name, …)
        [ON DELETE {CASCADE | SET NULL | NO ACTION | RESTRICT}]
        [ON UPDATE {CASCADE | SET NULL | NO ACTION | RESTRICT}]
        說明:
        on delete/on update,用于定義delete,update操作.以下是update,delete操作的各種約束類型:
        CASCADE:
        外鍵表中外鍵字段值會被更新,或所在的列會被刪除.
        RESTRICT:
        RESTRICT也相當于no action,即不進行任何操作.即,拒絕父表update外鍵關聯列,delete記錄.
        set null:
        被父面的外鍵關聯字段被update ,delete時,子表的外鍵列被設置為null.
        而對于insert,子表的外鍵列輸入的值,只能是父表外鍵關聯列已有的值.否則出錯.

        外鍵定義服從下列情況:(前提條件)
        1)
        所有tables必須是InnoDB型,它們不能是臨時表.因為在MySQL中只有InnoDB類型的表才支持外鍵.
        2)
        所有要建立外鍵的字段必須建立索引.
        3)
        對于非InnoDB表,FOREIGN KEY子句會被忽略掉。
        注意:
        創建外鍵時,定義外鍵名時,不能加引號.
        如: constraint 'fk_1' 或 constraint "fk_1"是錯誤的
        (3) 查看外鍵:
        SHOW CREATE TABLE ***;可以查看到新建的表的代碼以及其存儲引擎.也就可以看到外鍵的設置.
        刪除外鍵:
        alter table drop foreign key '外鍵名'.
        注意:
        只有在定義外鍵時,用constraint 外鍵名 foreign key …. 方便進行外鍵的刪除.
        若不定義,則可以:
        先輸入:alter table drop foreign key –>會提示出錯.此時出錯信息中,會顯示foreign key的系統默認外鍵名.—>
        用它去刪除外鍵.

        (4) 舉例

        實例一:
        4.1
        CREATE TABLE parent(id INT NOT NULL,
        PRIMARY KEY (id)
        ) TYPE=INNODB; — type=innodb 相當于 engine=innodb
        CREATE TABLE child(id INT, parent_id INT,
        INDEX par_ind (parent_id),
        FOREIGN KEY (parent_id) REFERENCES parent(id)
        ON DELETE CASCADE
        ) TYPE=INNODB;
        向parent插入數據后,向child插入數據,插入時,child中的parent_id的值只能是parent中有的數據,否則插入不成功;
        刪除parent記錄時,child中的相應記錄也會被刪除;–>因為: on delete cascade
        更新parent記錄時,不給更新;–>因為沒定義,默認采用restrict.
        4.2
        若child如下:
        mysql>
        create table child(id int not null primary key auto_increment,parent_id int,
        index par_ind (parent_id),
        constraint fk_1 foreign key (parent_id) references
        parent(id) on update cascade on delete restrict)
        type=innodb;
        用上面的:
        1).
        則可以更新parent記錄時,child中的相應記錄也會被更新;–>因為: on update cascade
        2).
        不能是子表操作,影響父表.只能是父表影響子表.
        3).
        刪除外鍵:
        alter table child drop foreign key fk_1;
        添加外鍵:
        alter table child add constraint fk_1 foreign key (parent_id) references
        parent(id) on update restrict on delete set null;

        (5) 多個外鍵存在:

        product_order表對其它兩個表有外鍵。
        一個外鍵引用一個product表中的雙列索引。另一個引用在customer表中的單行索引:
        CREATE TABLE product (category INT NOT NULL, id INT NOT NULL,
        price DECIMAL,
        PRIMARY KEY(category, id)) TYPE=INNODB;
        CREATE TABLE customer (id INT NOT NULL,
        PRIMARY KEY (id)) TYPE=INNODB;

        CREATE TABLE product_order (no INT NOT NULL AUTO_INCREMENT,
        product_category INT NOT NULL,
        product_id INT NOT NULL,
        customer_id INT NOT NULL,
        PRIMARY KEY(no),
        — 雙外鍵
        INDEX (product_category, product_id),
        FOREIGN KEY (product_category, product_id)
        REFERENCES product(category, id)
        ON UPDATE CASCADE ON DELETE RESTRICT,
        — 單外鍵
        INDEX (customer_id),
        FOREIGN KEY (customer_id)

        REFERENCES customer(id)) TYPE=INNODB;

        (6) 說明:

        1.若不聲明on update/delete,則默認是采用restrict方式.
        2.對于外鍵約束,最好是采用: ON UPDATE CASCADE ON DELETE RESTRICT 的方式.

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 亚洲国产精品无码久久久久久曰| 日本内射精品一区二区视频| 亚洲精品国产自在久久| 国产精品一二二区| 久久精品国产第一区二区三区| 久久精品国产99国产精品| 久久久久国产精品| 国产精品无码A∨精品影院| 亚洲а∨天堂久久精品| 国产精品亚洲αv天堂无码| 久久精品视频网| 第一福利永久视频精品| 精品无码人妻一区二区三区品| 五月花精品视频在线观看| 亚洲国产精品一区二区第四页| 亚洲一二成人精品区| 国产麻豆精品久久一二三| 无码国产精品一区二区免费vr| 三级高清精品国产| 久久精品夜色噜噜亚洲A∨| 国产精品亚洲视频| 国产激情精品一区二区三区| 中国精品videossex中国高清| 精品久久久久久久久中文字幕| 国产精品国产三级国产普通话 | 国产精品福利区一区二区三区四区| 精品国产一区二区三区免费| 99久久久精品免费观看国产| 国产区精品一区二区不卡中文| 久久久久亚洲精品天堂| 午夜精品久久久久久久| 亚洲精品色午夜无码专区日韩| 香港aa三级久久三级老师2021国产三级精品三级在 | 99热这里只有精品6国产免费| 四虎精品免费永久在线| 99久久国产综合精品五月天喷水 | 久久久精品人妻无码专区不卡| 久久精品午夜一区二区福利| 欧美精品高清在线xxxx| 青草国产精品视频。| 亚洲?V乱码久久精品蜜桃|