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

MySQL 列屬性約束與存儲引擎深度解析:從 NOT NULL 到外鍵、引擎選型

     編輯:MySQL 綜合教學

五大列約束核心關鍵字

  • UNIQUE / PRIMARY KEY:唯一性與主鍵;
  • FOREIGN KEY:引用完整性;
  • CHECK:條件檢查(MySQL 8.0.16+ 生效);
  • NOT NULL:非空約束;
  • DEFAULT:默認值。

1. 非空約束

CREATE TABLE one (a INT NOT NULL, b INT);
INSERT INTO one (a) VALUES (10);  -- b 隱式 NULL
SELECT * FROM one;  -- a=10, b=NULL

MySQL 每行針對可 NULL 列額外佔用 1 字節標記 NULL 位圖。

2. 默認值約束

CREATE TABLE two (
  a INT NOT NULL DEFAULT 10,
  b INT NOT NULL DEFAULT 20,
  c INT DEFAULT 30,
  d INT
);
INSERT INTO two (a) VALUES (10);  -- b=20, c=30, d=NULL
INSERT INTO two (b) VALUES (10);  -- a=10, c=30, d=NULL

規則:

  • 默認值必須為常量,不可為函數/表達式;
  • 2. 列可 NULL 且無顯式 DEFAULT → 默認 NULL;
  • 列 NOT NULL 且無顯式 DEFAULT → 無默認值,插入必須顯式賦值;
  • TIMESTAMP 可用 DEFAULT CURRENT_TIMESTAMP;
  • BLOB/TEXT 不支持 DEFAULT。

3. 主鍵約束

唯一標識行,隱含 NOT NULL + UNIQUE,每表僅一個。

定義方式

-- 列級定義(單列主鍵)
CREATE TABLE teacher (t_id INT PRIMARY KEY, t_name VARCHAR(10));

-- 表級定義(支持組合主鍵)
CREATE TABLE teacher (
  t_name VARCHAR(10),
  classname VARCHAR(6),
  PRIMARY KEY (t_name, classname)
);

設計原則

  • 業務無關的代理鍵(如自增 ID)優於天然主鍵;
  • 主鍵值不應更新;
  • 組合主鍵僅為「一個主鍵包含多列」,非多個主鍵。

管理操作

ALTER TABLE teacher DROP PRIMARY KEY;  -- 刪除主鍵約束
ALTER TABLE teacher ADD PRIMARY KEY (t_id);  -- 重新添加

4. 自動增長

CREATE TABLE teacher (
  t_id INT PRIMARY KEY AUTO_INCREMENT,
  t_name VARCHAR(10)
);
INSERT INTO teacher VALUES (NULL, '周傑倫');  -- t_id=1
INSERT INTO teacher (t_name) VALUES ('劉德華');  -- t_id=2

-- 修改起始值
ALTER TABLE teacher AUTO_INCREMENT = 10;
INSERT INTO teacher VALUES (NULL, '范冰冰');  -- t_id=10

特性:需整型+索引;允許顯式插入指定值(不衝突即可);允許 UPDATE 主鍵值(不衝突即可)。

5. 實體關係建模

關係建模方式示例
1:1兩表共享主鍵用戶表 + 用戶詳情表
1:NN 端加外鍵指向 1 端主鍵班級(1) - 學生(N)
M:N中間表雙外鍵學生 - 課程 (選課表)

6. 外鍵約束深度解析

6.1 定義語法

CREATE TABLE class (
  class_id INT PRIMARY KEY AUTO_INCREMENT,
  class_name VARCHAR(20) NOT NULL DEFAULT 'deeplearning'
) ENGINE=InnoDB CHARSET=utf8;

CREATE TABLE student (
  stu_id INT PRIMARY KEY AUTO_INCREMENT,
  stu_name VARCHAR(10) NOT NULL DEFAULT '',
  class_id INT,
  FOREIGN KEY (class_id) REFERENCES class(class_id)
) ENGINE=InnoDB CHARSET=utf8;

⚠️ 外鍵僅 InnoDB 支持,MyISAM 會忽略報警但不生效。

6.2 級聯動作

動作ON DELETEON UPDATE說明
CASCADE從表關聯行刪除從表關聯列同步更新強一致性
SET NULL從表關聯列置 NULL從表關聯列置 NULL保留從表數據,需列允許 NULL
RESTRICT拒絕父表操作拒絕父表操作保護數據完整性(默認)
NO ACTION同 RESTRICT同 RESTRICT標準 SQL 語法

6.3 修改外鍵(必須重建)

-- 查看外鍵名
SHOW CREATE TABLE student \G;
-- 刪除
ALTER TABLE student DROP FOREIGN KEY student_ibfk_1;
-- 重建並指定級聯
ALTER TABLE student ADD FOREIGN KEY (class_id) REFERENCES class(class_id)
  ON DELETE SET NULL ON UPDATE CASCADE;

7. 存儲引擎對比與選型

7.1 文件存儲差異

  • MyISAM:.frm 結構、.MYD 數據、.MYI 索引三文件;
  • InnoDB:.frm 結構 + 共享表空間 ibdata1 或獨立 .ibd(innodb_file_per_table=ON)。

7.2 核心差異矩陣

7.3 引擎選型決策樹

IF 需要事務 OR 外鍵 OR 高並發寫入 OR 崩潰安全
    THEN InnoDB
ELSE IF 純只讀/讀多寫少 + 極致讀性能 + 文件級備份分發
    THEN MyISAM
ELSE
    InnoDB  -- 通用首選

7.4 指定引擎語法

CREATE TABLE classroom (
  room_id INT PRIMARY KEY AUTO_INCREMENT,
  room_no CHAR(3)
) ENGINE=MyISAM CHARSET=utf8;

-- 修改引擎(有外鍵會失敗)
ALTER TABLE class ENGINE=MyISAM;  -- ERROR 1217 (23000)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
維度MyISAMInnoDB
鎖粒度表鎖行鎖(基於索引)
事務不支持支持 ACID
外鍵不支持支持
全文索引原生支持5.6+ 支持
COUNT(*)元數據秒返全表掃描
壓縮myisampack 索引壓縮頁面壓縮(透明)
崩潰恢復需 REPAIR TABLERedo Log 自動恢復
讀性能極優(只讀場景)優(8.0 大幅提升)
寫性能極優(批量導入)良(雙寫、刷盤開銷)