首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 學習筆記(五):約束類型詳解與實戰

     編輯:MySQL 綜合教學

MySQL 學習筆記(五):約束類型詳解與實戰

約束是保證數據完整性的核心機制。MySQL 支援五大約束類型,本文結合圖示與實戰 SQL 逐一解析。

1. NOT NULL(非空約束)

強制列不能為 NULL。

CREATE TABLE t_user (
    id INT PRIMARY KEY,
    username VARCHAR(50) NOT NULL
);

NOT NULL 示例

2. PRIMARY KEY(主鍵約束)

  • 每張表僅能有一個主鍵
  • 主鍵值唯一且非空(隱含 NOT NULL)
  • 常配合 AUTO_INCREMENT 自增
CREATE TABLE t_user (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50)
);

主鍵示例

3. UNIQUE KEY(唯一約束)

  • 保證列值唯一
  • 允許 NULL(且可有多個 NULL)
  • 一張表可建多個唯一約束
CREATE TABLE t_user (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50),
    email VARCHAR(100) UNIQUE
);

唯一約束建表

插入重複 email 會報錯:Duplicate entry 'test@test.com' for key 'email'
唯一約束報錯

4. DEFAULT(默認約束)

插入數據時未指定該列,自動填充默認值。

CREATE TABLE t_user (
    id INT PRIMARY KEY AUTO_INCREMENT,
    sex TINYINT DEFAULT 3  -- 0:女 1:男 3:未知
);

默認約束建表

插入時不指定 sex,自動存 3:
默認值生效

5. FOREIGN KEY(外鍵約束)

  • 維護表間引用完整性,實現 1:1 或 1:N 關係
  • 要求父表被引用列有索引(無則自動創建)
  • 存儲引擎必須為 InnoDB

配置文件啟用 InnoDB

[mysqld]
default-storage-engine=INNODB

建表示例:省份(父表)— 城市(子表)

-- 父表
CREATE TABLE province (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50)
) ENGINE=INNODB;

-- 子表
CREATE TABLE city (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50),
    pid INT,
    FOREIGN KEY (pid) REFERENCES province(id)
) ENGINE=INNODB;

父表結構 子表外鍵

外鍵引用操作(ON DELETE / ON UPDATE)

動作說明
CASCADE級聯:父表刪除/更新,子表匹配行同步刪除/更新
SET NULL置空:父表刪除/更新,子表外鍵列設為 NULL(需列允許 NULL)
RESTRICT限制:拒絕父表刪除/更新(有子表引用時)
NO ACTION標準 SQL 關鍵字,MySQL 中等同 RESTRICT

外鍵動作

級聯刪除演示

  1. 插入父表 province(id=3) 及子表 city(pid=3)
  2. 刪除 province WHERE id=3
  3. 子表對應 pid=3 的行自動刪除

刪除父表 子表級聯刪除

6. 列級約束 vs 表級約束

  • 列級約束:定義在列後,如 id INT PRIMARY KEY
  • 表級約束:定義在所有列之後,如 CONSTRAINT fk_pid FOREIGN KEY (pid) REFERENCES province(id),支援組合鍵、約束命名

總結

合理使用約束能在數據庫層面攔截髒數據,減少應用層判邏輯。主鍵、唯一、外鍵是業務建模的三大基石,DEFAULT 提升寫入便利性,NOT NULL 是數據質量的第一道防線。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved