1. 程式人生 > >一步一步學MySQL----6 表的約束

一步一步學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)

這裡寫圖片描述