mysql主鍵約束的寫法:“CREATE table 表名(字段名 數據類型 PRIMARY KEY)”;mysql外鍵約束的寫法:“CREATE TABLE 表名(FOREIGN KEY 字段名 REFERENCES 主表名 主鍵列)”。
(推薦教程:mysql視頻教程)
mysql主鍵約束
主鍵(PRIMARY KEY)的完整稱呼是“主鍵約束”,是?MySQL?中使用最為頻繁的約束。一般情況下,為了便于 DBMS 更快的查找到表中的記錄,都會在表中設置一個主鍵。
1、在創建表時設置主鍵約束
在 CREATE TABLE 語句中,通過 PRIMARY KEY 關鍵字來指定主鍵。
在定義字段的同時指定主鍵,語法格式如下:
??PRIMARY?KEY?[默認值]
例 1
在 test_db 數據庫中創建 tb_emp3 數據表,其主鍵為 id,SQL 語句和運行結果如下。
mysql>?CREATE?TABLE?tb_emp3 ????->?( ????->?id?int(11)?PRIMARY?KEY, ????->?name?VARchar(25), ????->?deptId?INT(11), ????->?salary?FLOAT ????->?); Query?OK,?0?rows?affected?(0.37?sec) mysql>?DESC?tb_emp3; +--------+-------------+------+-----+---------+-------+ |?Field??|?Type????????|?Null?|?Key?|?Default?|?Extra?| +--------+-------------+------+-----+---------+-------+ |?id?????|?int(11)?????|?NO???|?PRI?|?NULL????|???????| |?name???|?varchar(25)?|?YES??|?????|?NULL????|???????| |?deptId?|?int(11)?????|?YES??|?????|?NULL????|???????| |?salary?|?float???????|?YES??|?????|?NULL????|???????| +--------+-------------+------+-----+---------+-------+ 4?rows?in?set?(0.14?sec)
或者是在定義完所有字段之后指定主鍵,語法格式如下:
[CONSTRAINT?]?PRIMARY?KEY?[字段名]
例 2
在 test_db 數據庫中創建 tb_emp4? 數據表,其主鍵為 id,SQL 語句和運行結果如下。
mysql>?CREATE?TABLE?tb_emp4 ????->?( ????->?id?INT(11), ????->?name?VARCHAR(25), ????->?deptId?INT(11), ????->?salary?FLOAT, ????->?PRIMARY?KEY(id) ????->?); Query?OK,?0?rows?affected?(0.37?sec) mysql>?DESC?tb_emp4; +--------+-------------+------+-----+---------+-------+ |?Field??|?Type????????|?Null?|?Key?|?Default?|?Extra?| +--------+-------------+------+-----+---------+-------+ |?id?????|?int(11)?????|?NO???|?PRI?|?NULL????|???????| |?name???|?varchar(25)?|?YES??|?????|?NULL????|???????| |?deptId?|?int(11)?????|?YES??|?????|?NULL????|???????| |?salary?|?float???????|?YES??|?????|?NULL????|???????| +--------+-------------+------+-----+---------+-------+ 4?rows?in?set?(0.14?sec)
2、在修改表時添加主鍵約束
主鍵約束不僅可以在創建表的同時創建,也可以在修改表時添加。但是需要注意的是,設置成主鍵約束的字段中不允許有空值。
在修改數據表時添加主鍵約束的語法格式如下:
ALTER?TABLE??ADD?PRIMARY?KEY();
查看 tb_emp2 數據表的表結構,SQL 語句和運行結果如下所示。
mysql>?DESC?tb_emp2; +--------+-------------+------+-----+---------+-------+ |?Field??|?Type????????|?Null?|?Key?|?Default?|?Extra?| +--------+-------------+------+-----+---------+-------+ |?id?????|?int(11)?????|?NO???|?????|?NULL????|???????| |?name???|?varchar(30)?|?YES??|?????|?NULL????|???????| |?deptId?|?int(11)?????|?YES??|?????|?NULL????|???????| |?salary?|?float???????|?YES??|?????|?NULL????|???????| +--------+-------------+------+-----+---------+-------+ 4?rows?in?set?(0.14?sec)
例 3
修改數據表 tb_emp2,將字段 id 設置為主鍵,SQL 語句和運行結果如下。
mysql>?ALTER?TABLE?tb_emp2 ????->?ADD?PRIMARY?KEY(id); Query?OK,?0?rows?affected?(0.94?sec) Records:?0??Duplicates:?0??Warnings:?0 mysql>?DESC?tb_emp2; +--------+-------------+------+-----+---------+-------+ |?Field??|?Type????????|?Null?|?Key?|?Default?|?Extra?| +--------+-------------+------+-----+---------+-------+ |?id?????|?int(11)?????|?NO???|?PRI?|?NULL????|???????| |?name???|?varchar(30)?|?YES??|?????|?NULL????|???????| |?deptId?|?int(11)?????|?YES??|?????|?NULL????|???????| |?salary?|?float???????|?YES??|?????|?NULL????|???????| +--------+-------------+------+-----+---------+-------+ 4?rows?in?set?(0.12?sec)
通常情況下,當在修改表時要設置表中某個字段的主鍵約束時,要確保設置成主鍵約束的字段中值不能夠有重復的,并且要保證是非空的。否則,無法設置主鍵約束。
mysql外鍵約束
MySQL 外鍵約束(FOREIGN KEY)是表的一個特殊字段,經常與主鍵約束一起使用。對于兩個具有關聯關系的表而言,相關聯字段中主鍵所在的表就是主表(父表),外鍵所在的表就是從表(子表)。
外鍵用來建立主表與從表的關聯關系,為兩個表的數據建立連接,約束兩個表中數據的一致性和完整性。比如,一個水果攤,只有蘋果、桃子、李子、西瓜等 4 種水果,那么,你來到水果攤要買水果就只能選擇蘋果、桃子、李子和西瓜,其它的水果都是不能購買的。
定義外鍵時,需要遵守下列規則:
-
主表必須已經存在于數據庫中,或者是當前正在創建的表。如果是后一種情況,則主表與從表是同一個表,這樣的表稱為自參照表,這種結構稱為自參照完整性。
-
必須為主表定義主鍵。
-
主鍵不能包含空值,但允許在外鍵中出現空值。也就是說,只要外鍵的每個非空值出現在指定的主鍵中,這個外鍵的內容就是正確的。
-
在主表的表名后面指定列名或列名的組合。這個列或列的組合必須是主表的主鍵或候選鍵。
-
外鍵中列的數目必須和主表的主鍵中列的數目相同。
-
外鍵中列的數據類型必須和主表主鍵中對應列的數據類型相同。
1、在創建表時設置外鍵約束
在 CREATE TABLE 語句中,通過 FOREIGN KEY 關鍵字來指定外鍵,具體的語法格式如下:
[CONSTRAINT?]?FOREIGN?KEY?字段名?[,字段名2,…] REFERENCES??主鍵列1?[,主鍵列2,…]
例 4
為了展現表與表之間的外鍵關系,本例在 test_db 數據庫中創建一個部門表 tb_dept1,表結構如下表所示。
字段名稱 | 數據類型 | 備注 |
---|---|---|
id | INT(11) | 部門編號 |
name | VARCHAR(22) | 部門名稱 |
location | VARCHAR(22) | 部門位置 |
創建 tb_dept1 的 SQL 語句和運行結果如下所示。
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)
創建數據表 tb_emp6,并在表 tb_emp6 上創建外鍵約束,讓它的鍵 deptId 作為外鍵關聯到表 tb_dept1 的主鍵 id,SQL 語句和運行結果如下所示。
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)
以上語句執行成功之后,在表 tb_emp6 上添加了名稱為 fk_emp_dept1 的外鍵約束,外鍵名稱為 deptId,其依賴于表 tb_dept1 的主鍵 id。
注意:從表的外鍵關聯的必須是主表的主鍵,且主鍵和外鍵的數據類型必須一致。例如,兩者都是 INT 類型,或者都是 CHAR 類型。如果不滿足這樣的要求,在創建從表時,就會出現“Error 1005(HY000): Can’t create table”錯誤。
2、在修改表時添加外鍵約束
外鍵約束也可以在修改表時添加,但是添加外鍵約束的前提是:從表中外鍵列中的數據必須與主表中主鍵列中的數據一致或者是沒有數據。
在修改數據表時添加外鍵約束的語法格式如下:
ALTER?TABLE??ADD?CONSTRAINT? FOREIGN?KEY()?REFERENCES??();
例 5
修改數據表 tb_emp2,將字段 deptId 設置為外鍵,與數據表 tb_dept1 的主鍵 id 進行關聯,SQL 語句和運行結果如下所示。
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_emp2G ***************************?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)
注意:在為已經創建好的數據表添加外鍵約束時,要確保添加外鍵約束的列的值全部來源于主鍵列,并且外鍵列不能為空。
相關推薦:mysql視頻教程