MySQL外鍵約束(FOREIGN KEY)
MySQL 外鍵約束(FOREIGN KEY)是表的一個(gè)特殊字段成翩,經(jīng)常與主鍵約束一起使用。對(duì)于兩個(gè)具有關(guān)聯(lián)關(guān)系的表而言赦役,相關(guān)聯(lián)字段中主鍵所在的表就是主表(父表)麻敌,外鍵所在的表就是從表(子表)。
外鍵用來建立主表與從表的關(guān)聯(lián)關(guān)系掂摔,為兩個(gè)表的數(shù)據(jù)建立連接术羔,約束兩個(gè)表中數(shù)據(jù)的一致性和完整性赢赊。比如,一個(gè)水果攤级历,只有蘋果释移、桃子、李子寥殖、西瓜等 4 種水果玩讳,那么,你來到水果攤要買水果就只能選擇蘋果嚼贡、桃子熏纯、李子和西瓜,其它的水果都是不能購(gòu)買的编曼。
主表刪除某條記錄時(shí)豆巨,從表中與之對(duì)應(yīng)的記錄也必須有相應(yīng)的改變。一個(gè)表可以有一個(gè)或多個(gè)外鍵掐场,外鍵可以為空值往扔,若不為空值,則每一個(gè)外鍵的值必須等于主表中主鍵的某個(gè)值熊户。
定義外鍵時(shí)萍膛,需要遵守下列規(guī)則:
? ? 主表必須已經(jīng)存在于數(shù)據(jù)庫(kù)中,或者是當(dāng)前正在創(chuàng)建的表嚷堡。如果是后一種情況蝗罗,則主表與從表是同一個(gè)表,這樣的表稱為自參照表蝌戒,這種結(jié)構(gòu)稱為自參照完整性串塑。
? ? 必須為主表定義主鍵。
? ? 主鍵不能包含空值北苟,但允許在外鍵中出現(xiàn)空值桩匪。也就是說,只要外鍵的每個(gè)非空值出現(xiàn)在指定的主鍵中友鼻,這個(gè)外鍵的內(nèi)容就是正確的傻昙。
? ? 在主表的表名后面指定列名或列名的組合。這個(gè)列或列的組合必須是主表的主鍵或候選鍵彩扔。
? ? 外鍵中列的數(shù)目必須和主表的主鍵中列的數(shù)目相同妆档。
? ? 外鍵中列的數(shù)據(jù)類型必須和主表主鍵中對(duì)應(yīng)列的數(shù)據(jù)類型相同。
實(shí)例:
--創(chuàng)建用戶表并將UID設(shè)為主鍵
DROP TABLE IF EXISTS tbl_user;
CREATE TABLE tbl_user (
? uId INT NOT NULL AUTO_INCREMENT COMMENT '用戶編號(hào)',
? uName VARCHAR(50) NOT NULL COMMENT '用戶名',
? uPass VARCHAR(10) NOT NULL COMMENT '密碼',
? head VARCHAR(50) NOT NULL COMMENT '頭像',
? regTime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '注冊(cè)時(shí)間',
? gender smallint(6) NOT NULL COMMENT '性別',
? PRIMARY KEY (uId) /*設(shè)置用戶編號(hào)為主鍵*/
) ENGINE=InnoDB? DEFAULT CHARSET=utf8;
--創(chuàng)建版塊表虫碉,并將版塊編號(hào)設(shè)為主鍵
DROP TABLE IF EXISTS tbl_board;
CREATE TABLE tbl_board (
? boardid INT NOT NULL AUTO_INCREMENT COMMENT '版塊編號(hào)',
? boardName VARCHAR(50) NOT NULL COMMENT '版塊標(biāo)題',
? parentId INT NOT NULL COMMENT '父版塊編號(hào)',
? PRIMARY KEY (boardid) /*設(shè)置版塊編號(hào)為主鍵*/
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--創(chuàng)建帖子表贾惦,并將帖子編號(hào)設(shè)為主鍵,同時(shí)建立與用戶表和版塊表的關(guān)聯(lián)關(guān)系
DROP TABLE IF EXISTS tbl_topic;
CREATE TABLE tbl_topic (
? topicId INT NOT NULL AUTO_INCREMENT COMMENT '帖子編號(hào)',
? title VARCHAR(50) NOT NULL COMMENT '帖子標(biāo)題',
? content VARCHAR(1000) NOT NULL COMMENT '帖子內(nèi)容',
? publishTime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '發(fā)帖時(shí)間',
? modifyTime TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '修改時(shí)間',
? uId INT NOT NULL COMMENT '用戶編號(hào)',
? boardId INT NOT NULL COMMENT '版塊編號(hào)',
? PRIMARY KEY (topicId), /*設(shè)置主鍵*/
FOREIGN KEY FK_UID (uId) REFERENCES tbl_user(uId),/*設(shè)置外鍵*/
FOREIGN KEY FK_BID (boardId) REFERENCES tbl_board(boardId) /*設(shè)置外鍵*/?
) ENGINE=InnoDB? DEFAULT CHARSET=utf8;