在SQL中,約束(Constraints) 是作用于數據庫表字段上的規則,用于強制保證數據的完整性、準確性和一致性。當插入、更新或刪除數據時,約束會自動驗證操作是否符合規則,若違反則拒絕執行。
以下是SQL中常見的約束類型及其作用:
📌 1. PRIMARY KEY
(主鍵約束)
- 作用:唯一標識表中的每一條記錄(類似身份證號)。
- 特點:
- 唯一性:值不可重復。
- 非空性:值不可為
NULL
。 - 一個表只能有一個主鍵(可由單列或多列組合)。
CREATE TABLE Users (id INT PRIMARY KEY, -- 單列主鍵name VARCHAR(50)
);-- 多列組合主鍵
CREATE TABLE Orders (order_id INT,product_id INT,PRIMARY KEY (order_id, product_id)
);
📌 2. FOREIGN KEY
(外鍵約束)
- 作用:確保表間數據關聯的完整性(如訂單必須屬于存在的用戶)。
- 特點:
- 指向另一張表的主鍵或唯一鍵。
- 可定義級聯操作(如
ON DELETE CASCADE
:主表刪除時,自動刪除從表關聯數據)。
CREATE TABLE Orders (order_id INT PRIMARY KEY,user_id INT,-- 關聯Users表的主鍵idFOREIGN KEY (user_id) REFERENCES Users(id)ON DELETE CASCADE -- 用戶刪除時,其訂單自動刪除
);
📌 3. UNIQUE
(唯一約束)
- 作用:確保字段值在表內唯一(允許空值)。
- 特點:
- 一個表可有多個唯一約束。
- 與主鍵區別:允許
NULL
值(主鍵不允許)。
CREATE TABLE Employees (id INT PRIMARY KEY,email VARCHAR(100) UNIQUE -- 郵箱必須唯一
);
📌 4. NOT NULL
(非空約束)
- 作用:強制字段不允許存入
NULL
值(必須提供有效數據)。 - 常見場景:關鍵字段如姓名、訂單號等。
CREATE TABLE Products (id INT PRIMARY KEY,name VARCHAR(50) NOT NULL -- 產品名不能為空
);
📌 5. CHECK
(檢查約束)
- 作用:自定義條件校驗字段值(如年齡范圍、數值正負)。
CREATE TABLE Students (id INT PRIMARY KEY,age INT CHECK (age >= 18), -- 年齡必須≥18grade CHAR(1) CHECK (grade IN ('A','B','C')) -- 等級只能是A,B,C
);
📌 6. DEFAULT
(默認值約束)
- 作用:當插入數據未指定字段值時,自動填充預設值。
CREATE TABLE Orders (id INT PRIMARY KEY,order_date DATE DEFAULT CURRENT_DATE -- 未指定日期時自動用當前日期
);
?? 約束的注意事項
- 命名約束:顯式命名便于維護(否則數據庫自動生成隨機名)。
CREATE TABLE Users (id INT,CONSTRAINT pk_users PRIMARY KEY (id) -- 命名主鍵約束 );
- 修改約束:可通過
ALTER TABLE
增刪約束。ALTER TABLE Employees ADD CONSTRAINT chk_salary CHECK (salary > 0); ALTER TABLE Employees DROP CONSTRAINT chk_salary;
- 性能影響:外鍵和唯一約束會自動創建索引,可能影響寫入速度,但提升查詢效率。
💡 應用場景示例
約束類型 | 實際應用場景 |
---|---|
PRIMARY KEY | 用戶ID、訂單號等唯一標識字段 |
FOREIGN KEY | 訂單關聯用戶ID、評論關聯文章ID |
UNIQUE | 用戶郵箱、手機號等不可重復的業務字段 |
NOT NULL | 必填項(如用戶名、創建時間) |
CHECK | 價格≥0、性別只能是’M’或’F’等邏輯校驗 |
DEFAULT | 自動填充創建時間、狀態默認值 |
合理使用約束可避免臟數據(如無效外鍵、重復訂單號),是數據庫設計的核心環節!