約束保障資料完整性,MySQL 支援主鍵、唯一、外鍵、CHECK (8.0.16 前僅解析不強制) 及命名約束。
id INT PRIMARY KEY 或建表末尾 PRIMARY KEY (id)。PRIMARY KEY (order_id, product_id) 僅能放建表末尾。CONSTRAINT pk_orders PRIMARY KEY (id),利於錯誤訊息識別與後續刪除。CONSTRAINT uk_email UNIQUE (email)。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 | 子行外鍵置預設值 | 子行外鍵置預設值 |
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))。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 僅刪除主鍵約束與索引。