原創(chuàng)聲明:本文為作者原創(chuàng),未經(jīng)允許不得轉(zhuǎn)載,經(jīng)授權(quán)轉(zhuǎn)載需注明作者和出處
記得在第十三章左聯(lián),創(chuàng)建student表的時(shí)候說(shuō)了句,字段class_i是當(dāng)做一個(gè)外鍵,并不是一個(gè)真的外鍵。那么真的外鍵又是個(gè)啥?
外鍵屬于一種約束,限制你對(duì)數(shù)據(jù)庫(kù)的操作,它是為了防止因?yàn)椴僮鞑划?dāng)產(chǎn)生冗余數(shù)據(jù)/臟數(shù)據(jù)的一種約束。刪掉幾個(gè)新增的class_id為3的數(shù)據(jù),右鍵student表,選擇設(shè)計(jì)表。然后創(chuàng)建一個(gè)外鍵,將class_id設(shè)為一個(gè)外鍵:
然后保存。
然后,我們?nèi)lass表刪除id為1的數(shù)據(jù):
這時(shí)候刷新student表,你會(huì)發(fā)現(xiàn),student表中的class_id為1的數(shù)據(jù)一起被刪除了:
我們可以找到,設(shè)置外鍵的時(shí)候,刪除時(shí)和新增時(shí)都有四個(gè)選項(xiàng):
沒錯(cuò),造成student表中數(shù)據(jù)被刪除的就是刪除時(shí)的這個(gè)CASCADE。這四個(gè)選項(xiàng)是事件觸發(fā)限制,意思分別是:
以上是通過軟件來(lái)創(chuàng)建外鍵,如果通過語(yǔ)句,應(yīng)該是這樣:
CREATE TABLE student(
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(5) NOT NULL,
gender VARCHAR(1) NOT NULL,
stu_no VARCHAR(10) NOT NULL,
class_id INT NOT NULL,
PRIMARY KEY(id),
FOREIGN KEY(class_id) REFERENCES class(id)
);
這句話是說(shuō)引用class表的id字段到student表的class_id字段作為外鍵,查看外鍵,可以發(fā)現(xiàn)創(chuàng)建出來(lái)的外鍵刪除時(shí)和更新時(shí)都是默認(rèn)的:
如果想要修改觸發(fā)限制可以這么做:
CREATE TABLE student(
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(5) NOT NULL,
gender VARCHAR(1) NOT NULL,
stu_no VARCHAR(10) NOT NULL,
class_id INT NOT NULL,
PRIMARY KEY(id),
FOREIGN KEY(class_id) REFERENCES class(id) ON DELETE CASCADE ON UPDATE CASCADE
);
之所以把外鍵放到最后,是因?yàn)槠綍r(shí)寫程序不太喜歡使用這種方式,用得非常少,我也不是太會(huì),因?yàn)橛袝r(shí)候覺得數(shù)據(jù)庫(kù)限制得太強(qiáng)了不太自由,相比之下我本人更喜歡在程序中維護(hù)數(shù)據(jù)的一致性。那個(gè),對(duì)于外鍵這塊,我先干了,你們隨意。
emmm,mysql的基礎(chǔ)到此結(jié)束了,還有啥索引什么的,以后遇到了講講。后面的內(nèi)容不定期更新,也都是零散講一些技巧。