1. 程式人生 > >MySQL從入門到放棄第三章:約束

MySQL從入門到放棄第三章:約束

約束

學習目錄
- 約束保證資料的完整行和一致性
- 約束按資料列的數目劃分:
- 表級約束
- 列級約束
- 約束按功能劃分:
- NOT NULL 非空約束
- PRIMARY KEY 主鍵約束
- UNIQUE KEY 唯一約束
- DEFAULT 預設約束
- FOREIGN KEY 外來鍵約束

外來鍵約束FOREIGN KEY
  • 外來鍵約束 保證資料一致性,完整性,實現一對一,一對多的關係
  • 外來鍵約束的要求:
    1. 父表和子表必須使用相同的儲存引擎,而且盡職使用臨時表
      • 具有外來鍵列的表為子表
        ,子表所參照的表為父表
      • 編輯資料表的預設儲存引擎 MySQL配置檔案 default-storage-engine=INNODB
    2. 資料表的儲存引擎只能為InnoDB
    3. 外來鍵列和參照列必須具有相似的資料型別,其中數字的長度或是否有符號必須相同;而字元的長度則可以不同
      • 具有FOREIGN KEY 的那一列為外來鍵列,它所參照的那一列為參照列
    4. 外來鍵列和參照列必須建立索引。如果外來鍵列不存在索引的話,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,兩者必須具有相似的資料型別,其中數字的長度或是否有符號必須相同;而字元的長度則可以不同

外來鍵約束的參照操作
  • 表關聯之後,父表更新,子表是否更新的操作
  • 實際開發中不去定義物理的外來鍵,而是邏輯的外來鍵(使用某種結構而不是FOREIGN KEY這個關鍵字)
    1. CASCADE: 從父表刪除或更新且自動刪除,或個鞥新子表中匹配的行
    2. SET NULL:從父表刪除或更新行,並設定子表中的外來鍵列為NULL。如果使用該選項,必須保證子表列沒有指定NOT NULL
    3. RESTRICT: 拒絕對父表的刪除或更新操作
    4. 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表級約束和列級約束
    • 對一個數據列建立的約束為列級約束,多個則為表級約束
    • 列級約束既可以在列定義時宣告,也可以在列定義後宣告
    • 表級約束只能在列定義後宣告