首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 約束與建表實戰演示

     編輯:MySQL 資料庫相關知識

資料完整性是關係型資料庫的核心,MySQL 透過多種約束機制確保資料準確、一致。本文結合圖示演示建表語法與常見約束的實際應用。

建表完整範例

建表示例圖解

上圖展示一個典型的 employee 員工表建立過程,包含主鍵、非空、唯一、預設值、外鍵等約束組合。

五大核心約束詳解

常見約束圖解
約束類型關鍵字作用典型場景
主鍵約束PRIMARY KEY唯一標識每一行,非空且唯一,一表僅一個員工 ID、訂單號、商品 SKU
非空約束NOT NULL欄位不允許為 NULL姓名、身份證號、價格、建立時間
唯一約束UNIQUE欄位值唯一,允許多個 NULLEmail、手機號、身份證號、用戶名
外鍵約束FOREIGN KEY維護表間引用完整性,防止孤兒資料訂單關聯用戶、明細關聯商品
檢查約束CHECK限制欄位值滿足條件 (MySQL 8.0.16+ 強制執行)年齡>0、性別 IN ('M','F')、價格>=0
自增屬性AUTO_INCREMENT整數類型自動遞增,常配合主鍵代理主鍵、流水號
預設值DEFAULTINSERT 未指定時自動填充建立時間 CURRENT_TIMESTAMP、狀態 0、性別 'U'

建表語法範本

CREATE TABLE `employee` (
  `emp_id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '員工編號',
  `emp_no` VARCHAR(20) NOT NULL COMMENT '工號',
  `name` VARCHAR(50) NOT NULL COMMENT '姓名',
  `gender` ENUM('M','F','U') NOT NULL DEFAULT 'U' COMMENT '性別',
  `id_card` CHAR(18) NOT NULL COMMENT '身份證',
  `email` VARCHAR(100) COMMENT '郵箱',
  `dept_id` INT UNSIGNED NOT NULL COMMENT '部門ID',
  `hire_date` DATE NOT NULL COMMENT '入職日期',
  `salary` DECIMAL(10,2) NOT NULL DEFAULT 0.00 COMMENT '薪資',
  `status` TINYINT NOT NULL DEFAULT 1 COMMENT '狀態 1在職 0離職',
  `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '建立時間',
  `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',
  PRIMARY KEY (`emp_id`),
  UNIQUE KEY `uk_emp_no` (`emp_no`),
  UNIQUE KEY `uk_id_card` (`id_card`),
  UNIQUE KEY `uk_email` (`email`),
  KEY `idx_dept_id` (`dept_id`),
  CONSTRAINT `fk_emp_dept` FOREIGN KEY (`dept_id`) REFERENCES `department`(`dept_id`) ON UPDATE CASCADE ON DELETE RESTRICT,
  CONSTRAINT `chk_salary` CHECK (`salary` >= 0)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='員工表';

約束命名最佳實踐

  • 主鍵:PK_表名 或由系統自動命名
  • 唯一索引:uk_表名_欄位
  • 普通索引:idx_表名_欄位
  • 外鍵:fk_子表_父表
  • 檢查約束:chk_表名_欄位

常見陷阱與注意事項

  1. 外鍵效能:高併發寫入場景下外鍵檢查會增加鎖競爭,核心交易表常在應用層維護引用完整性,資料庫層不建外鍵。
  2. CHECK 約束版本:MySQL 8.0.16 前僅語法解析不執行,升級後需驗證現有約束是否生效。
  3. ENUM 修改成本高:增減枚舉值需 DDL 鎖表,建議改用 TINYINT + 應用層字典或獨立字典表。
  4. 預設值陷阱:TIMESTAMP 若不顯式指定 DEFAULT CURRENT_TIMESTAMP,首個欄位會自動獲得自動初始化/更新屬性,其餘需顯式聲明。
  5. AUTO_INCREMENT 非主鍵:InnoDB 要求自增欄位必須是索引的最左列,通常直接設為主鍵。

合理運用約束,讓資料庫成為資料品質的第一道防線,減少應用層防禦性程式碼,提升系統整體健壯度。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved