MySQL-列的完整性約束

一.完整性約束條件:

是對字段進行限制,要求用戶對該屬性進行的操作符合特定的要求。如果不滿足完整性約束條件,數據庫系統將不再執行用戶的操作。MySQL中基本的完整性約束條件如表所示。下表是完整性約束條件:

1.設置表字段的主鍵約束(PRIMARY KEY,PK)

主鍵是表的一個特殊字段,能唯一標識該表中的每條信息。主鍵和記錄的關係,如同身份證和人的關係。主鍵用來標識每個記錄,每個記錄的主鍵值都不同。身份證用來表明人的身份,每個人都具有唯一的身份證號。設置表的主鍵是指在創建表時設置表的某個字段爲該表的主鍵。

主鍵的主要目的是幫助數據庫管理系統以最快的速度查找到表的某一條信息。主鍵必須滿足的條件就是主鍵必須是唯一的,表中任意兩條記錄的主鍵字段的值不能相同,並且是非空值。主鍵可以是單一的字段,也可以是多個字段的組合。

          1)單字段主鍵

          單字段主鍵的語法規則如下:

          CREATE TABLE tablename(

                    propName propType PRIMARY KEY, ......

          );

          或

          CREATE TABLE tablename(

                    propName propType , ......

                    PRIMARY KEY(propType

          );

demo:

創建表school,設置id字段爲PK約束,再查看class表信息,SQL語句如下

mysql> create database school;   #創建數據庫school

mysql> use school;   #選擇數據庫school

mysql> create table class(id int PRIMARY KEY, name varchar(128), teacher varchar(64));         #創建表class

mysql> desc class ;  #查詢表class 的定義, describe class 效果等同

mysql> show create table class ;  #同樣可以實現查詢表class 的定義

mysql> insert into class VALUES(1,'一班','martin');  #插入成功

mysql> insert into class VALUES(1,'二班','rock');    #因主鍵約束,插入失敗

Mysql 支持給主鍵設置名字:

CREATE TABLE tablename(

    propName propType , ......

    CONSTRAINT pk_name PRIMARY KEY(propType)

);

id字段的PK約束設置一個名字,可以執行SQL語句CONSTRAINT。創建表class:

2.多字段主鍵

主鍵是由多個屬性組合而成時,在屬性定義完之後統一設置主鍵。語法規則如下:

CREATE TABLE tablename(  

    propName1 propType ,

    propName2 propType ,

    ......                     

[CONSTRAINT pk_name]PRIMARY KEY(propName1, propName2)

);

demo:

mysql> create database school;   #創建數據庫school

mysql> use school;   #選擇數據庫school

mysql> create table class3(id int, name varchar(128), teacher varchar(64), CONSTRAINT id_pk PRIMARY KEY(id,name));         #創建表class3,設置聯合主鍵

mysql> desc class3 ;  #查詢表class3 的定義, describe class3 效果等同

mysql> insert into class VALUES(1,'一班','martin');  #插入成功

mysql> insert into class VALUES(1,'一班','rock');    #因聯合主鍵約束,插入失敗

2.設置表字段的外鍵約束(FOREIGN KEY,FK)

外鍵是表的一個特殊字段,外鍵約束是爲了保證多個表(通常爲兩個表)之間的參照完整性,即構建兩個表的字段之間的參照關係。

設置外鍵約束的兩個表之間具有父子關係,即子表中某個字段的取值範圍由父表決定。例如,表示一個班級和學生關係,即每個班級有多個學生。首先應該有兩個表:班級表和學生表,然後學生表有一個表示班級編號的字段no,其依賴於班級表的主鍵,這樣字段no就是學生表的外鍵,通過該字段班級表和學生表建立了關係。

  • 一個班級表:

ID

名稱

班主任

101

六年級一班

馬老師

102

六年級二班

潘老師

班級表主鍵 <ID>

每一行對應着一個班級,而一個班級對應着多個學生,所以班級表和學生表的關係就是“一對多”:

ID

姓名

班級ID

性別

年齡

1

小花

101

M

9

2

小紅

102

F

8

3

小軍

102

M

8

4

小白

101

F

9

班級表<ID> 爲學生表<班級ID >的外鍵

在具體設置FK約束時,設置FK約束的字段必須依賴於數據庫中已經存在的父表的主鍵,同時外鍵可以爲空(NULL)。

設置表中某字段的FK約束非常簡單,可以在MySQL數據庫管理系統中通過SQL語句FOREIGN KEY來實現,其語法形式如下:

CREATE TABLE tablename_1(  

    propName1 propType ,

    propName2 propType ,

    ......                     

    [CONSTRAINT fk_name]FOREIGN KEY(propName1) REFERENCES table2_name(table2_column)

);

demo:

其中,tablename_1參數是要設置外鍵的表名,propName1參數是要設置外鍵的字段,table2_name是父表的名稱,table2_column是父表中設置主鍵約束的字段名。

mysql> use school;   #選擇數據庫school

mysql> create table class(id int PRIMARY KEY, name varchar(128), teacher varchar(64));         #創建表class

mysql> desc class ;  #查詢表class 的定義, describe class 效果等同

mysql> mysql> create table student (id int PRIMARY KEY AUTO_INCREMENT, name varchar(64) NOT NULL, class_id int, sex enum('M','F'), FOREIGN KEY(class_id) REFERENCES class(id) );  #創建表student, class_id 爲表class id 字段的外鍵

mysql> insert into student(name, class_id, sex) values('小紅', 2, 'M');   #插入記錄,主鍵自增長

mysql> insert into student(name, sex) values('小軍', 'M');   #插入記錄,允許外鍵爲空

 

3.設置表字段的非空約束(NOT NULL, NK

設置表字段的非空約束(NOT NULL, NK

當數據庫表中的某個字段上的內容不希望設置爲NULL時,可以使用NK約束進行設置。NK約束在創建數據庫表時爲某些字段上加上“NOT NULL”約束條件,保證所有記錄中的該字段都有值。如果在用戶插入的記錄中該字段爲空值,那麼數據庫管理系統會報錯。

設置表中某字段的NK約束非常簡單,查看幫助文檔可以發現,在MySQL數據庫管理系統中是通過SQL語句NOT NULL來實現的,其語法形式如下:

CREATE TABLE tablename(

    propName propType NOT NULL , ......

);

如:

mysql> create database school;   #創建數據庫school

mysql> use school;   #選擇數據庫school

mysql> create table class(id int, name varchar(128) NOT NULL, teacher varchar(64));         #創建表class

mysql> desc class ;  #查詢表class 的定義, describe class 效果等同

mysql> show create table class ;  #同樣可以實現查詢表class 的定義

檢驗數據庫school中的class表中字段classno是否被設置爲NK約束,執行SQL語句DESCRIBE,具體如下:

 

4.設置表字段唯一約束(UNIQUE,UK)

當數據庫表中某個字段上的內容不允許重複時,可以使用UK約束進行設置。UK約束在創建數據庫時爲某些字段加上“UNIQUE”約束條件,保證所有記錄中該字段上的值不重複。如果在用戶插入的記錄中該字段上的值與其他記錄中該字段上的值重複,那麼數據庫管理系統會報錯。

設置表中某字段的UK約束非常簡單,可以在MySQL數據庫管理系統中通過SQL語句UNIQUE來實現,其語法形式如下:

CREATE TABLE tablename(

    propName propType UNIQUE, ......

);

注意: unique 約束允許受約束的字段出現多個空值 NULL, 不算重複

如:

mysql> create database school;   #創建數據庫school

mysql> use school;   #選擇數據庫school

mysql> create table class(id int, name varchar(128) UNIQUE, teacher varchar(64));         #創建表class

mysql> desc class ;  #查詢表class 的定義, describe class 效果等同

mysql> show create table class ;  #同樣可以實現查詢表class 的定義

 

5.設置表字段值自動增加(AUTO_INCREMENT)

AUTO_INCREMENT是MySQL唯一擴展的完整性約束,當向數據庫表中插入新記錄時,字段上的值會自動生成唯一的ID。在具體設置AUTO_INCREMENT約束時,一個數據庫表中只能有一個字段使用該約束,該字段的數據類型必須是整數類型。由於設置AUTO_INCREMENT約束後的字段會生成唯一的ID,因此該字段也經常會同時設置成PK主鍵。

設置表中某字段值的自動增加約束非常簡單,可以在MySQL數據庫管理系統中通過SQL語句AUTO_INCREMENT來實現,其語法形式如下:

CREATE TABLE tablename(

    propName propType AUTO_INCREMENT, ......

);

在上述語句中,tablename參數表示所要設置非空約束的字段名字,propName參數爲屬性名,propType爲屬性類型,propName字段要設置自動增加約束。默認情況下,字段propName的值從1開始增加,每增加一條記錄,記錄中該字段的值就會在前一條記錄(或已存在的最大值(包括曾經存在的))的基礎上加1。

mysql> create database school;   #創建數據庫school

mysql> use school;   #選擇數據庫school

mysql> create table class(id int PRIMARY KEY AUTO_INCREMENT, name varchar(128) UNIQUE, teacher varchar(64));         #創建表class,設置字段id爲自增長

mysql> show create table class ;  #查詢表class 的定義

注意: mysql8 中,AUTO_INCREMENT 必須設爲鍵(主鍵、外鍵和唯一鍵均可)! 否則會報錯!

 

6.設置表字段的默認值(DEFAULT)

當爲數據庫表中插入一條新記錄時,如果沒有爲某個字段賦值,數據庫系統就會自動爲這個字段插入默認值。爲了達到這種效果,可通過SQL語句關鍵字DEFAULT來設置。

設置數據庫表中某字段的默認值非常簡單,可以在MySQL數據庫管理系統中通過SQL語句DEFAULT來實現,其語法形式如下:

CREATE TABLE tablename(

    propName propType DEFAULT defaultvalue, ......

);

注意: 如果沒有設置,則默認爲空

 

7.調整列的完整性約束

  主鍵PK、外鍵FK和 唯一鍵UK

新增

alter table [table_name] add constraint [constraint_name] [unique key| primary key|foreign key] ([column_name])

刪除

  1. 通過如下命令查詢鍵值的約束名:

show indexkeys from 表名;

  1. 執行如下命令刪除:

    主鍵:        alter table 表名 drop primary key;

外鍵或唯一鍵:  alter table 表名 drop index 約束名;

修改

按照上述步驟 先執行 刪除 然後再 新增 即可!

修改默認值DEFAULT、自增長和非空NK

使用如下語法重新定義列即可:

alter table 表名 modify 列名 類定義;

mysql> create database school;   #創建數據庫school

mysql> use school;   #選擇數據庫school

mysql> create table class(id int PRIMARY KEY AUTO_INCREMENT, name varchar(128) UNIQUE, teacher varchar(64));         #創建表class,設置字段id爲自增長

mysql> alter table class modify teacher varchar(64) DEFAULT Martin NOT NULL ;  #設置默認值和非空

mysql> alter table class modify teacher varchar(64) ; #取消默認值和非空

更多的關於數據庫學習我會在下面的文章中陸續的分享,也可以關注‘奇牛學院’

來一起討論

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章