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 位圖。
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
規則:
TIMESTAMP 可用 DEFAULT CURRENT_TIMESTAMP;BLOB/TEXT 不支持 DEFAULT。唯一標識行,隱含 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)
);
ALTER TABLE teacher DROP PRIMARY KEY; -- 刪除主鍵約束
ALTER TABLE teacher ADD PRIMARY KEY (t_id); -- 重新添加
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 主鍵值(不衝突即可)。
| 關係 | 建模方式 | 示例 |
|---|---|---|
| 1:1 | 兩表共享主鍵 | 用戶表 + 用戶詳情表 |
| 1:N | N 端加外鍵指向 1 端主鍵 | 班級(1) - 學生(N) |
| M:N | 中間表雙外鍵 | 學生 - 課程 (選課表) |
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 會忽略報警但不生效。
| 動作 | ON DELETE | ON UPDATE | 說明 |
|---|---|---|---|
| CASCADE | 從表關聯行刪除 | 從表關聯列同步更新 | 強一致性 |
| SET NULL | 從表關聯列置 NULL | 從表關聯列置 NULL | 保留從表數據,需列允許 NULL |
| RESTRICT | 拒絕父表操作 | 拒絕父表操作 | 保護數據完整性(默認) |
| NO ACTION | 同 RESTRICT | 同 RESTRICT | 標準 SQL 語法 |
-- 查看外鍵名
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;
.frm 結構、.MYD 數據、.MYI 索引三文件;.frm 結構 + 共享表空間 ibdata1 或獨立 .ibd(innodb_file_per_table=ON)。| 維度 | MyISAM | InnoDB |
|---|---|---|
| 鎖粒度 | 表鎖 | 行鎖(基於索引) |
| 事務 | 不支持 | 支持 ACID |
| 外鍵 | 不支持 | 支持 |
| 全文索引 | 原生支持 | 5.6+ 支持 |
| COUNT(*) | 元數據秒返 | 全表掃描 |
| 壓縮 | myisampack 索引壓縮 | 頁面壓縮(透明) |
| 崩潰恢復 | 需 REPAIR TABLE | Redo Log 自動恢復 |
| 讀性能 | 極優(只讀場景) | 優(8.0 大幅提升) |
| 寫性能 | 極優(批量導入) | 良(雙寫、刷盤開銷) |