字段約束是保障數據完整性、可靠性與準確性的關鍵機制。MySQL 支持六大核心約束,合理使用能從源頭杜絕髒數據。
CREATE TABLE student (
sid INT PRIMARY KEY,
name VARCHAR(20)
);
CREATE TABLE score (
sid INT,
cid INT,
grade FLOAT,
PRIMARY KEY (sid, cid)
);
-- 添加主鍵
ALTER TABLE good ADD PRIMARY KEY (gid);
-- 修改主鍵:必須先刪除再創建
ALTER TABLE book DROP PRIMARY KEY;
ALTER TABLE book ADD PRIMARY KEY (bnum);
ALTER TABLE child_table
ADD CONSTRAINT fk_name
FOREIGN KEY (child_col) REFERENCES parent_table (parent_col)
ON DELETE RESTRICT ON UPDATE CASCADE;
| 動作 | 行為 |
|---|---|
| CASCADE | 父表更新/刪除,子表跟隨更新/刪除 |
| SET NULL | 父表更新/刪除,子表外鍵列置 NULL |
| RESTRICT/NO ACTION | 拒絕父表操作(默認) |
-- 建表時指定
CREATE TABLE t (col INT NOT NULL);
-- 後續修改
ALTER TABLE t MODIFY col INT NOT NULL;
注意:非空列仍可插入空字符串 '' 或數值 0。
-- 建表時
CREATE TABLE t (status TINYINT DEFAULT 1);
-- 後續添加/修改/刪除
ALTER TABLE t ALTER status SET DEFAULT 2;
ALTER TABLE t ALTER status DROP DEFAULT;
-- 列級
CREATE TABLE t (email VARCHAR(50) UNIQUE);
-- 表級(支持組合唯一)
CREATE TABLE t (
a INT, b INT,
CONSTRAINT uk_ab UNIQUE (a, b)
);
-- 後續添加/刪除
ALTER TABLE t ADD UNIQUE (col);
ALTER TABLE t DROP INDEX uk_ab;
特性:允許一個 NULL 值,多列組合時只要組合值唯一即可。
CREATE TABLE t (
id INT AUTO_INCREMENT PRIMARY KEY
);
TRUNCATE TABLE 會重置計數器-- 通過約束名刪除(主鍵、唯一、外鍵、普通索引均適用)
ALTER TABLE t DROP INDEX constraint_name;