MySQL從入門到放棄第三章:約束
阿新 • • 發佈:2019-02-20
約束
學習目錄
- 約束保證資料的完整行和一致性
- 約束按資料列的數目劃分:
- 表級約束
- 列級約束
- 約束按功能劃分:
- NOT NULL 非空約束
- PRIMARY KEY 主鍵約束
- UNIQUE KEY 唯一約束
- DEFAULT 預設約束
- FOREIGN KEY 外來鍵約束
外來鍵約束FOREIGN KEY
- 外來鍵約束 保證資料一致性,完整性,實現一對一,一對多的關係
- 外來鍵約束的要求:
- 父表和子表必須使用相同的儲存引擎,而且盡職使用臨時表
- 具有外來鍵列的表為子表
- 編輯資料表的預設儲存引擎 MySQL配置檔案 default-storage-engine=INNODB
- 具有外來鍵列的表為子表
- 資料表的儲存引擎只能為InnoDB
- 外來鍵列和參照列必須具有相似的資料型別,其中數字的長度或是否有符號必須相同;而字元的長度則可以不同
- 具有FOREIGN KEY 的那一列為外來鍵列,它所參照的那一列為參照列
- 外來鍵列和參照列必須建立索引。如果外來鍵列不存在索引的話,MySQL將自動建立索引
- 參照列沒有索引,MySQL才會自動建立,外來鍵列沒有的話不會
- 父表和子表必須使用相同的儲存引擎,而且盡職使用臨時表
省份表
CREATE TABLE PROVINCES( `id` SMALLINT UNSIGNED PRIMARY
KEY AUTO_INCREMENT, pname VARCHAR(20) NOT NULL)users表
CREATE TABLE USERS( `id` SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, username VARCHAR(20) NOT NULL, pid SNALLINT UNSIGNED, FOREIGN KEY(pid) REFERENCES privinces (id) )
- 關係型資料庫,使用者表中想儲存省份,不用存省份,用省份id, 這裡的id就是外來鍵
- 有外來鍵的表users成為子表,參照的表provinces為父表
外來鍵pid參照 privinces表中的id,兩者必須具有相似的資料型別,其中數字的長度或是否有符號必須相同;而字元的長度則可以不同
外來鍵約束的參照操作
- CASCADE: 從父表刪除或更新且自動刪除,或個鞥新子表中匹配的行
- SET NULL:從父表刪除或更新行,並設定子表中的外來鍵列為NULL。如果使用該選項,必須保證子表列沒有指定NOT NULL
- RESTRICT: 拒絕對父表的刪除或更新操作
- NO ACTION: 標準SQL的關鍵字,在MySQL中與RESTRICT相同
> CREATE TABLE USER2(
>id
SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
> username VARCHAR(20) NOT NULL,
>pid SNALLINT UNSIGNED,
>FOREIGN KEY(pid) REFERENCES privinces (id) ON DELETE CASCADE)
>
MySQL表級約束和列級約束
- 對一個數據列建立的約束為列級約束,多個則為表級約束
- 列級約束既可以在列定義時宣告,也可以在列定義後宣告
- 表級約束只能在列定義後宣告