完整性約束在**資料庫層**強制保證資料品質,防止髒資料入庫。六大約束:主鍵 (PK)、外鍵 (FK)、非空 (NOT NULL)、唯一 (UNIQUE)、自增 (AUTO_INCREMENT)、預設值 (DEFAULT)。
CREATE TABLE t (id INT PRIMARY KEY, ...);CREATE TABLE t (id INT, course_id INT, PRIMARY KEY (id, course_id));CREATE TABLE child (id INT PRIMARY KEY, pid INT, CONSTRAINT fk_pid FOREIGN KEY (pid) REFERENCES parent(id));ON DELETE CASCADE (刪父刪子)、ON UPDATE CASCADE、SET NULL、RESTRICT (預設)、NO ACTION。CREATE TABLE t (id INT NOT NULL, name VARCHAR(20) NOT NULL);NOT NULL 節省空間、簡化優化器判斷、利於索引 (索引欄建議均 NOT NULL)。CREATE TABLE t (id INT PRIMARY KEY, email VARCHAR(100) UNIQUE);eq_ref/const 極快。UNIQUE KEY uk_user_course (user_id, course_id)。CREATE TABLE t (id INT PRIMARY KEY AUTO_INCREMENT, ...);auto_increment_offset + auto_increment_increment 錯開多節點 ID。CURRENT_TIMESTAMP (TIMESTAMP/DATETIME 8.0.13+)、UUID() (8.0.13+)、運算式 (8.0.13+)。不支援:任意函數 (NOW、RAND 等)、子查詢。CREATE TABLE t (status TINYINT DEFAULT 1, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);CREATE TABLE orders (
order_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
user_id BIGINT UNSIGNED NOT NULL,
order_no VARCHAR(32) NOT NULL UNIQUE,
status TINYINT NOT NULL DEFAULT 1 COMMENT '1待付款 2已付款 3已發貨 4完成 5取消',
total_amount DECIMAL(12,2) NOT NULL DEFAULT '0.00',
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
CONSTRAINT fk_user FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='訂單表';
| 原寫法 | MySQL 相容寫法 | 說明 |
|---|---|---|
DEFAULT (GETDATE()) | TIMESTAMP DEFAULT CURRENT_TIMESTAMP | 改用 TIMESTAMP 型別 |
DEFAULT ('') (INT 欄位) | DEFAULT 0 | 型別必須匹配 |
IDENTITY(1,1) | AUTO_INCREMENT | 同義 |
CHECK (age > 0) | 8.0.16+ 支援 CHECK,舊版觸發器/應用層 | MySQL 歷史不支援 CHECK |