mysql中設(shè)置外鍵約束的方法

這篇文章將為大家詳細(xì)講解有關(guān)MySQL中設(shè)置外鍵約束的方法,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

成都創(chuàng)新互聯(lián)公司主打移動(dòng)網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、網(wǎng)站改版、網(wǎng)絡(luò)推廣、網(wǎng)站維護(hù)、主機(jī)域名、等互聯(lián)網(wǎng)信息服務(wù),為各行業(yè)提供服務(wù)。在技術(shù)實(shí)力的保障下,我們?yōu)榭蛻舫兄Z穩(wěn)定,放心的服務(wù),根據(jù)網(wǎng)站的內(nèi)容與功能再?zèng)Q定采用什么樣的設(shè)計(jì)。最后,要實(shí)現(xiàn)符合網(wǎng)站需求的內(nèi)容、功能與設(shè)計(jì),我們還會(huì)規(guī)劃穩(wěn)定安全的技術(shù)方案做保障。

mysql中設(shè)置外鍵約束的方法:可以通過(guò)FOREIGN KEY關(guān)鍵字來(lái)指定外鍵,語(yǔ)法“ALTER TABLE 表名 ADD CONSTRAINT 外鍵名 FOREIGN KEY(列名) REFERENCES 主表名 (列名);”。

(1) 外鍵的使用:

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

(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}]
說(shuō)明:
on delete/on update,用于定義delete,update操作.以下是update,delete操作的各種約束類型:
CASCADE:
外鍵表中外鍵字段值會(huì)被更新,或所在的列會(huì)被刪除.
RESTRICT:
RESTRICT也相當(dāng)于no action,即不進(jìn)行任何操作.即,拒絕父表update外鍵關(guān)聯(lián)列,delete記錄.
set null:
被父面的外鍵關(guān)聯(lián)字段被update ,delete時(shí),子表的外鍵列被設(shè)置為null.
而對(duì)于insert,子表的外鍵列輸入的值,只能是父表外鍵關(guān)聯(lián)列已有的值.否則出錯(cuò).

外鍵定義服從下列情況:(前提條件)
1)
所有tables必須是InnoDB型,它們不能是臨時(shí)表.因?yàn)樵贛ySQL中只有InnoDB類型的表才支持外鍵.
2)
所有要建立外鍵的字段必須建立索引.
3)
對(duì)于非InnoDB表,F(xiàn)OREIGN KEY子句會(huì)被忽略掉。
注意:
創(chuàng)建外鍵時(shí),定義外鍵名時(shí),不能加引號(hào).
如: constraint 'fk_1' 或 constraint "fk_1"是錯(cuò)誤的
(3) 查看外鍵:
SHOW CREATE TABLE ***;可以查看到新建的表的代碼以及其存儲(chǔ)引擎.也就可以看到外鍵的設(shè)置.
刪除外鍵:
alter table drop foreign key '外鍵名'.
注意:
只有在定義外鍵時(shí),用constraint 外鍵名 foreign key .... 方便進(jìn)行外鍵的刪除.
若不定義,則可以:
先輸入:alter table drop foreign key -->會(huì)提示出錯(cuò).此時(shí)出錯(cuò)信息中,會(huì)顯示foreign key的系統(tǒng)默認(rèn)外鍵名.--->
用它去刪除外鍵.

(4) 舉例

實(shí)例一:
4.1
CREATE TABLE parent(id INT NOT NULL,
                   PRIMARY KEY (id)
) TYPE=INNODB;                      -- type=innodb 相當(dāng)于 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插入數(shù)據(jù)后,向child插入數(shù)據(jù),插入時(shí),child中的parent_id的值只能是parent中有的數(shù)據(jù),否則插入不成功;
刪除parent記錄時(shí),child中的相應(yīng)記錄也會(huì)被刪除;-->因?yàn)? on delete cascade
更新parent記錄時(shí),不給更新;-->因?yàn)闆]定義,默認(rèn)采用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記錄時(shí),child中的相應(yīng)記錄也會(huì)被更新;-->因?yàn)? 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) 多個(gè)外鍵存在:

product_order表對(duì)其它兩個(gè)表有外鍵。
一個(gè)外鍵引用一個(gè)product表中的雙列索引。另一個(gè)引用在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) 說(shuō)明:

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

關(guān)于mysql中設(shè)置外鍵約束的方法就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

文章名稱:mysql中設(shè)置外鍵約束的方法
分享地址:http://bm7419.com/article34/pcehse.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計(jì)關(guān)鍵詞優(yōu)化、網(wǎng)站排名微信公眾號(hào)、全網(wǎng)營(yíng)銷推廣移動(dòng)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

營(yíng)銷型網(wǎng)站建設(shè)