MySQL常見建表選項及約束
閱讀目錄---SQL/">MySQL常見的建表選項及約束:
1、 ofollow,noindex" target="_blank">create table選項
2、指定表選項:engine、auto_increment、comment
1、not null:非空約束
2、unique:唯一約束
3、primary key:主鍵約束
4、foreign key:外來鍵
5、check:檢查---enum、set
一、CREATE TABLE 選項
1、在定義列的時候,指定列選項
1)DEFAULT <literal>:定義列的預設值
當插入一個新行到表中並且沒有給該列明確賦值時,如果定義了列的預設值,將自動得到預設值 ;如果沒有,則為null。
當然,也可以在INSERT和UPDATE語句中使用DEFAULT關鍵字顯式地給列賦預設值:
函式default(column)可以得到一個列的預設值:
2)comment:用來給列添加註釋,最多255個字元,註釋會儲存到資料字典中。
建立帶有列註釋的表stu_comment
從資料字典查詢註釋資訊
2、在CREATE TABLE語句中的表選項
1)engine:指定表使用的儲存引擎
儲存引擎:決定了資料如何儲存以及如何訪問,還有事務如何處理
MySQL允許對每個表使用不同的儲存引擎,如果在create table語句中沒有指定儲存引擎,則使用預設的儲存引擎。
mysql> show engines; #查詢所有支援的儲存引擎
mysql> CREATE TABLE sexes(sex char(1) NOT NULL) ENGINE = INNODB;
注意:儲存引擎是個重點,後面我們詳細講解。
2)auto_increment:決定當向表中插入第一行時,自增列得到的第一個值是多少
3)comment:給表添加註釋
二、CREATE TABLE 約束
作用:可以為列定義約束(constraint)
約束主要是防止非法資料進入到表中,確保資料的正確性和一致性(統稱資料完整性);
約束也可以防止一個表被刪除 。
注意:
1)MySQL中約束儲存在information_schema.table_constraints中,可以通過該表查詢約束資訊;
2)進行約束定義的時間:使用create table語句、使用alter table語句。
常用的約束的型別:5種
①not null:非空約束,指定某列不為空
②unique:唯一約束,指定某列和幾列組合的資料不能重複
③primary key:主鍵約束,指定某列的資料不能重複、唯一
④foreign key:外來鍵,指定該列記錄屬於主表中的一條記錄,參照另一條資料
⑤check:檢查,指定一個表示式,用於檢驗指定資料
約束定義的語法:
注意:
1)NOT NULL約束只能在列級別定義,作用在多個列上的約束只能定義在表級別,例如複合主鍵約束;
2)列級別上不能定義外來鍵約束,並且不能給約束起名字,由MySQL自動命名(NOT NULL除外);
3)表級別上定義的約束可以給約束起名字(CHECK約束除外)
1、、not null非空約束
作用:用於確保當前列的值不為空。
注意:非空約束只能出現在表物件的列上。
2、unique唯一約束
1.唯一約束是指定table的列或列組合不能重複,保證資料的唯一性,約束的列不允許有重複值;
2.唯一約束不允許出現重複的值,但是可以為多個null;
3.同一個表可以有多個唯一約束,多個列組合的約束
可見,唯一性約束的列可以有多個null值,因為null <> null
4.在建立唯一約束時,如果不給唯一約束名稱,就預設和列名相同;
5.唯一約束不僅可以在一個表內建立,而且可以同時多表建立組合唯一約束。
3、primary key主鍵約束
primary key = not null + unique
主鍵:用來唯一的標示表中的每一行(型別一般為整型或者字串)
具有主鍵約束的列不允許有null值,並且不允許有重複值;
每個表最多隻允許一個主鍵(可定義聯合主鍵),主鍵名總是PRIMARY。
!!給主鍵一個新的名字,但在資料字典中,主鍵名還是顯示primary
聯合主鍵(用幾個列進行唯一標識一行)
4、foreign key外來鍵約束
外來鍵約束:
參照完整性約束,保證一個或兩個表之間的參照完整性,外來鍵是構建於一個表的兩個欄位或是兩個表的兩個欄位之間的參照關係。
注意:
1)具有外來鍵約束的列的值不能隨便給,必須滿足外來鍵所引用的主鍵的取值;
2)一張表中可以定義多個外來鍵;
3)外來鍵列預設可以給null值。
按照定義,外來鍵必須引用一個主鍵或者唯一鍵,引用的主鍵一般在另外一張表中,也可以是本表的主鍵(後者稱為“自引用”)。
父子表:
外來鍵所在的表叫做子表、從表
外來鍵所引用的主鍵所在的表叫做父表、主表
注意:父子表是相對而言的,表a可以是表b的子表,但同時也可以是表c的父表
示例:建立外來鍵約束
查詢資料字典,檢視外來鍵約束的資訊:
上面建立子表的時候給外來鍵約束命名emp_deptid_fk;
如果不給外來鍵約束命名,那麼預設的名字是表名_ibfk_n, n是整數,從1開始;
此時,emp表中deptid列(外來鍵約束)受dept主表限制
外來鍵引用定義:
、
在定義外來鍵約束時,通過使用on delete cascade或者on delete set null選項,可以改變外來鍵的預設刪除規則:
①ON DELETE CASCADE:級聯刪除。當刪除父表中的行時,如果子表中有依賴於被刪除父行的子行存在,那麼連同子行一起刪除(很危險!!!)
②ON DELETE SET NULL:當刪除父表中的行時,如果子表中有依賴於被刪除父行的子行存在,那麼不刪除,而是將子行的外來鍵列設定為null
……
5、check約束
MySQL可以使用check約束,但check約束對資料驗證沒有任何作用。
Oracle中可以使用check約束,是有相應的作用的。
The CHECK clause is parsed but ignored by all storage engines。
定義資料庫列時,可以使用ENUM(enumeration,列舉)和SET(集合)型別:變通的實現CHECK約束
兩者的區別是:
使用ENUM,只能選一個值;
使用SET,可以選多個值;
ENUM和SET中的值都必須是字串型別。
1、enum列舉型別
注意:
在內部儲存ENUM值時,MYSQL給ENUM中的每個值一個順序號碼:第一個值的順序號碼是1,第二個值的順序號碼是2,以此類推。當排序或比較ENUM的時候,使用這些順序號碼進行。
2、set型別:因為可以列舉多個值,所以在建表列約束中常被使用到。
@author:http://www.cnblogs.com/geaozhang/