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

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

| 約束類型 | 關鍵字 | 作用 | 典型場景 |
|---|---|---|---|
| 主鍵約束 | PRIMARY KEY | 唯一標識每一行,非空且唯一,一表僅一個 | 員工 ID、訂單號、商品 SKU |
| 非空約束 | NOT NULL | 欄位不允許為 NULL | 姓名、身份證號、價格、建立時間 |
| 唯一約束 | UNIQUE | 欄位值唯一,允許多個 NULL | Email、手機號、身份證號、用戶名 |
| 外鍵約束 | FOREIGN KEY | 維護表間引用完整性,防止孤兒資料 | 訂單關聯用戶、明細關聯商品 |
| 檢查約束 | CHECK | 限制欄位值滿足條件 (MySQL 8.0.16+ 強制執行) | 年齡>0、性別 IN ('M','F')、價格>=0 |
| 自增屬性 | AUTO_INCREMENT | 整數類型自動遞增,常配合主鍵 | 代理主鍵、流水號 |
| 預設值 | DEFAULT | INSERT 未指定時自動填充 | 建立時間 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_表名_欄位TINYINT + 應用層字典或獨立字典表。TIMESTAMP 若不顯式指定 DEFAULT CURRENT_TIMESTAMP,首個欄位會自動獲得自動初始化/更新屬性,其餘需顯式聲明。合理運用約束,讓資料庫成為資料品質的第一道防線,減少應用層防禦性程式碼,提升系統整體健壯度。