首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 約束完整指南:主鍵、唯一、外鍵、CHECK、CONSTRAINT 命名

     編輯:MySQL 綜合教學

約束保障資料完整性,MySQL 支援主鍵、唯一、外鍵、CHECK (8.0.16 前僅解析不強制) 及命名約束。

主鍵約束 (PRIMARY KEY)

  • 單列:id INT PRIMARY KEY 或建表末尾 PRIMARY KEY (id)。
  • 複合:PRIMARY KEY (order_id, product_id) 僅能放建表末尾。
  • 規則:唯一、非空、每表僅一個、最小化 (無多餘列)。
  • 可命名:CONSTRAINT pk_orders PRIMARY KEY (id),利於錯誤訊息識別與後續刪除。

唯一約束 (UNIQUE)

  • 與主鍵差異:可多個、允許 NULL (單列 NULL 可多行)、自動建立唯一索引。
  • 命名:CONSTRAINT uk_email UNIQUE (email)。

外鍵約束 (FOREIGN KEY) —— 僅 InnoDB

CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    user_id INT,
    CONSTRAINT fk_orders_user FOREIGN KEY (user_id)
        REFERENCES users(user_id)
        ON DELETE RESTRICT ON UPDATE CASCADE
);

參照動作

動作刪除父行時更新父鍵時
RESTRICT (預設)拒絕拒絕
CASCADE級聯刪除子行級聯更新子行
SET NULL子行外鍵置 NULL子行外鍵置 NULL
NO ACTION同 RESTRICT同 RESTRICT
SET DEFAULT子行外鍵置預設值子行外鍵置預設值

建立規則

  • 父表需先存在並有主鍵/唯一鍵。
  • 子表外鍵列數、型別、順序必須與父表參照列完全一致。
  • 允許自參照 (員工-主管)。

CHECK 約束 (8.0.16+ 強制生效)

CREATE TABLE student (
    id CHAR(6) PRIMARY KEY,
    gender CHAR(1) CHECK (gender IN ('M','F')),
    birth_date DATE CHECK (birth_date > '1980-01-01'),
    best_score INT,
    avg_score INT,
    CHECK (best_score > avg_score)
);
  • 可引用子查詢:CHECK (dept_id IN (SELECT id FROM dept))。
  • 跨列比較必須用表級 CHECK。

CONSTRAINT 命名最佳實踐

  • 所有表級約束建議顯式命名:CONSTRAINT chk_salary CHECK (salary > 0)。
  • 錯誤訊息會顯示約束名,方便應用層捕獲具體違規原因。
  • 刪除約束:ALTER TABLE tbl DROP CONSTRAINT constraint_name; (MySQL 8.0+),舊版用 DROP INDEX (主鍵/唯一) 或 DROP FOREIGN KEY。

刪除表級聯效果

  • DROP TABLE 會連同所有約束、被參照的外鍵一併刪除。
  • ALTER TABLE ... DROP PRIMARY KEY 僅刪除主鍵約束與索引。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved