一步一步學MySQL----6 表的約束
完整性約束是為了表的資料的正確性!如果資料不正確,那麼一開始就不能新增到表中。
資料庫中的完整性約束用來防止對資料的意外破壞,來保證資料的安全性和一致性。
完整性約束關鍵字 | 作用 |
---|---|
NOT NULL(NK) | 約束欄位的值不能為空 |
UNIQUE KEY(UK) | 約束欄位的值是唯一 |
DEFAULT | 設定欄位的預設值 |
PRIMARY KEY(PK) | 約束欄位為表的主鍵,可以作為該表記錄的唯一標識 |
AUTO_INCREMENT | 設定欄位的值自動增加(型別必須是整數) |
FOREIGN KEY(FK) | 約束欄位為表的外來鍵 |
6.1 設定主鍵約束(PRIMARY KEY, PK)
主鍵能夠標識表中每條資訊的唯一性;
建立主鍵是為了便於資料庫管理系統快速的查詢到表中的記錄;
設定主鍵約束時,必須要滿足主鍵欄位的值是唯一的、非空的。
說明:主鍵可以是單一欄位,也可以是多個欄位,因此,可以分為單欄位主鍵和多欄位主鍵。
(1)單欄位主鍵
語法:create table table_name(欄位名 資料型別 PRIMARY KEY
, …….);
例如:
mysql> create table student(
-> id int primary key,
-> name varchar(20),
-> sex varchar(10)
-> );
Query OK, 0 rows affected (0.09 sec)
說明:這裡建立了一個學生的表,建立了三個欄位(id,name,sex),其中id為主鍵。
為了驗證student表中的欄位id是否被設定為PK約束,執行desc查詢語句,如下:
(2)多欄位主鍵
語法:create table table_name(欄位名 資料型別, ……. , constraint
約束名 primary key(欄位名, 欄位名,… …));
例如:
mysql> create table student1(
-> id int,
-> class_id int,
-> name varchar(20),
-> sex varchar(20),
-> constraint pk_id_classId primary key(id, class_id)
-> );
Query OK, 0 rows affected (0.08 sec)
說明:這裡建立了一個學生的表studetn1,建立了四個欄位(id,class_id,name,sex),其中id和class_id設為了主鍵。
為了驗證student1表中的欄位id和class_id是否被設定為PK約束,執行desc查詢語句,如下:
6.2 設定非空約束(NOT NULL, NK)
非空約束在建立資料庫表時為某些欄位加上“NOT NULL”約束條件,保證所有記錄中該欄位都有值。
注意:如果使用者插入的記錄中,該欄位為空值,則資料庫管理系統會報錯。
語法:create table table_name(欄位名 資料型別 NOT NULL, …….);
例如:
mysql> create table student2(
-> id int not null,
-> name varchar(20),
-> sex varchar(20)
-> );
Query OK, 0 rows affected (0.07 sec)
說明:這裡建立了一個學生的表studetn2,建立了三個欄位(id, name,sex),其中id設為了非空約束。
為了驗證student2表中的欄位id是否被設定為NK約束,執行desc查詢語句,如下:
6.3 設定欄位的預設值(DEFAULT)
當要為資料庫表中插入一條新紀錄時,如果沒有為某個欄位賦值,那麼資料庫系統會自動為這個欄位插入預設值。為了達到這種效果,可以通過關鍵字DEFAULT來設定。
語法:create table table_name(欄位名 資料型別 DEFAULT 預設值, … … );
例如:
mysql> create table student3(
-> id int not null,
-> name varchar(20) default ‘pop’,
-> sex varchar(20)
-> );
Query OK, 0 rows affected (0.12 sec)
說明:這裡建立了一個學生的表studetn3,建立了三個欄位(id, name,sex),其中欄位id設為了非空,欄位name設有預設值‘pop’。
為了驗證student3表中的欄位id是否被設定為NK約束,欄位name是否設為了預設值‘pop’,執行desc查詢語句,如下:
6.4 設定唯一約束(UNIQUE, UK)
UK約束在建立資料庫表時為某些欄位加上“UNIQUE”約束條件,保證所有記錄中該欄位上的值不重複。
注意:如果使用者插入的記錄中,該欄位上的值與其他記錄裡該欄位上的值重複,則資料庫管理系統會報錯。
語法:create table table_name(欄位名 資料型別 UNIQUE,… … );
例如:
mysql> create table student4(
-> id int unique,
-> name varchar(20),
-> sex varchar(20)
-> );
Query OK, 0 rows affected (0.08 sec)
說明:這裡建立了一個學生的表studetn4,建立了三個欄位(id, name,sex),其中欄位id設為了唯一約束。
為了驗證student4表中的欄位id是否被設定為UK約束,執行desc查詢語句,如下:
6.5 設定欄位值自動增加(AUTO_INCREMENT)
AUTO_INCREMENT是MySQL唯一擴充套件的完整性約束,當為資料庫表中插入新記錄時,欄位上的值會自動生成唯一的ID。
在具體設定AUTO_INCREMENT約束時,一個數據庫表中只能有一個欄位使用該約束,該欄位的資料型別必須是整型。
注意:由於設定AUTO_INCREMENT約束後的欄位會生成唯一的ID,所以該欄位也經常會設定成PK主鍵。
語法:create table table_name(欄位名 資料型別 AUTO_INCREMENT,… … );
例如:
mysql> create table student5(
-> id int primary key auto_increment,
-> name varchar(20),
-> address varchar(60)
-> );
Query OK, 0 rows affected (0.13 sec)
說明:這裡建立了一個學生的表studetn5,建立了三個欄位(id,name,address),其中欄位id設為了auto_increment(同時也是PK)約束。
為了驗證student5表中的欄位id是否被設定為auto_increment約束,執行desc查詢語句,如下:
6.6 設定外來鍵約束(FOREIGN KEY, FK)
外來鍵約束就是把兩張表的資料通過某種條件關聯起來, 作用是保持資料完整性和一致性。
設定外來鍵約束的兩個表之間具有父子關係,即子表中某個欄位的取值範圍由父表所決定。
在具體設定外來鍵約束時,設定FK約束的欄位必須依賴於資料庫中已經存在的父表的主鍵,同時外來鍵可以為NULL。
形象地說:
(1)當兩個表建立一對多關係的時候,”一”的那一端是父表,”多”的那一端是子表。
(2)父表設定一個主鍵
(3)子表設定一個外來鍵
(4)外來鍵與主鍵相關聯
(5)B表引用A表的欄位作為外來鍵,那麼A表是主表,B表是從表。
語法:create table table_name(欄位名 資料型別,… …
constraint 外來鍵約束名 foreign key(欄位名) references (父表名((欄位名));
例如:
建立一個父表班級classes
mysql> create table classes(
-> id int auto_increment primary key,
-> name varchar(20)
-> );
Query OK, 0 rows affected (0.17 sec)
建立子表student
//第一種:新增關鍵字
mysql> create table student(
-> id int auto_increment,
-> name varchar(20),
-> constraint pk_id primary key(id),
-> class_id int references classes(id)
-> );
Query OK, 0 rows affected (0.08 sec)
//第二種:額外宣告
mysql> create table student6(
-> id int auto_increment,
-> name varchar(20),
-> constraint pk_id primary key(id),
-> class_id int,
-> constraint fk_classes_id foreign key(class_id) references classes(id)
-> );
Query OK, 0 rows affected (0.14 sec)