字段名稱 | 數(shù)據(jù)類型 | 備注 |
---|---|---|
id | INT(11) | 部門編號 |
name | VARCHAR(22) | 部門名稱 |
location | VARCHAR(22) | 部門位置 |
創(chuàng)建 tb_dept1 的 SQL 語句和運行結(jié)果如下所示。
mysql> CREATE TABLE tb_dept1 -> ( -> id INT(11) PRIMARY KEY, -> name VARCHAR(22) NOT NULL, -> location VARCHAR(50) -> ); Query OK, 0 rows affected (0.37 sec)
創(chuàng)建數(shù)據(jù)表 tb_emp6,并在表 tb_emp6 上創(chuàng)建外鍵約束,讓它的鍵 deptId 作為外鍵關聯(lián)到表 tb_dept1 的主鍵 id,SQL 語句和運行結(jié)果如下所示。
mysql> CREATE TABLE tb_emp6 -> ( -> id INT(11) PRIMARY KEY, -> name VARCHAR(25), -> deptId INT(11), -> salary FLOAT, -> CONSTRAINT fk_emp_dept1 -> FOREIGN KEY(deptId) REFERENCES tb_dept1(id) -> ); Query OK, 0 rows affected (0.37 sec) mysql> DESC tb_emp6; +--------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(25) | YES | | NULL | | | deptId | int(11) | YES | MUL | NULL | | | salary | float | YES | | NULL | | +--------+-------------+------+-----+---------+-------+ 4 rows in set (1.33 sec)
以上語句執(zhí)行成功之后,在表 tb_emp6 上添加了名稱為 fk_emp_dept1 的外鍵約束,外鍵名稱為 deptId,其依賴于表 tb_dept1 的主鍵 id。
注意:從表的外鍵關聯(lián)的必須是主表的主鍵,且主鍵和外鍵的數(shù)據(jù)類型必須一致。例如,兩者都是 INT 類型,或者都是 CHAR 類型。如果不滿足這樣的要求,在創(chuàng)建從表時,就會出現(xiàn)“ERROR 1005(HY000): Can't create table”錯誤。
外鍵約束也可以在修改表時添加,但是添加外鍵約束的前提是:從表中外鍵列中的數(shù)據(jù)必須與主表中主鍵列中的數(shù)據(jù)一致或者是沒有數(shù)據(jù)。
在修改數(shù)據(jù)表時添加外鍵約束的語法格式如下:
ALTER TABLE 數(shù)據(jù)表名> ADD CONSTRAINT 外鍵名>
FOREIGN KEY(列名>) REFERENCES 主表名> (列名>);
例 2
修改數(shù)據(jù)表 tb_emp2,將字段 deptId 設置為外鍵,與數(shù)據(jù)表 tb_dept1 的主鍵 id 進行關聯(lián),SQL 語句和運行結(jié)果如下所示。
mysql> ALTER TABLE tb_emp2 -> ADD CONSTRAINT fk_tb_dept1 -> FOREIGN KEY(deptId) -> REFERENCES tb_dept1(id); Query OK, 0 rows affected (1.38 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> SHOW CREATE TABLE tb_emp2\G *************************** 1. row *************************** Table: tb_emp2 Create Table: CREATE TABLE `tb_emp2` ( `id` int(11) NOT NULL, `name` varchar(30) DEFAULT NULL, `deptId` int(11) DEFAULT NULL, `salary` float DEFAULT NULL, PRIMARY KEY (`id`), KEY `fk_tb_dept1` (`deptId`), CONSTRAINT `fk_tb_dept1` FOREIGN KEY (`deptId`) REFERENCES `tb_dept1` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=gb2312 1 row in set (0.12 sec)
注意:在為已經(jīng)創(chuàng)建好的數(shù)據(jù)表添加外鍵約束時,要確保添加外鍵約束的列的值全部來源于主鍵列,并且外鍵列不能為空。
當一個表中不需要外鍵約束時,就需要從表中將其刪除。外鍵一旦刪除,就會解除主表和從表間的關聯(lián)關系。
刪除外鍵約束的語法格式如下所示:
ALTER TABLE 表名> DROP FOREIGN KEY 外鍵約束名>;
例 3
刪除數(shù)據(jù)表 tb_emp2 中的外鍵約束 fk_tb_dept1,SQL 語句和運行結(jié)果如下所示。
mysql> ALTER TABLE tb_emp2 -> DROP FOREIGN KEY fk_tb_dept1; Query OK, 0 rows affected (0.19 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> SHOW CREATE TABLE tb_emp2\G *************************** 1. row *************************** Table: tb_emp2 Create Table: CREATE TABLE `tb_emp2` ( `id` int(11) NOT NULL, `name` varchar(30) DEFAULT NULL, `deptId` int(11) DEFAULT NULL, `salary` float DEFAULT NULL, PRIMARY KEY (`id`), KEY `fk_tb_dept1` (`deptId`) ) ENGINE=InnoDB DEFAULT CHARSET=gb2312 1 row in set (0.00 sec)
可以看到,tb_emp2 中已經(jīng)不存在 FOREIGN KEY,原有的名稱為 fk_emp_dept 的外鍵約束刪除成功。
到此這篇關于MySQL外鍵約束(FOREIGN KEY)案例講解的文章就介紹到這了,更多相關MySQL外鍵約束(FOREIGN KEY)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!