主鍵是表數據唯一標識,也是 InnoDB 聚簇索引的核心。本文涵蓋主鍵聲明語法、聯合主鍵應用、自增屬性配置、默認值設置、時間戳自動賦值的完整實戰演示,助你構建高性能表結構。
-- 建表時指定 CREATE TABLE tbl_name (..., PRIMARY KEY(index_col_name)); -- 事後添加 ALTER TABLE tbl_name ADD PRIMARY KEY (index_col_name, ...);
主鍵隱含 NOT NULL + UNIQUE,若列未顯式聲明 NOT NULL,MySQL 會隱式添加。
如「防火牆規則表」以 (host, port) 為主鍵,單列無法唯一確定記錄。
CREATE TABLE firewall(
host VARCHAR(11) NOT NULL,
port SMALLINT(4),
access ENUM('deny','allow') NOT NULL,
PRIMARY KEY (host, port)
);
INSERT INTO firewall(host, port, access) VALUES('202.65.3.87', 21, 'deny'); -- 成功
-- 聯合主鍵每列隱含 NOT NULL,組合唯一
CREATE DATABASE ssh2; USE ssh2; CREATE TABLE user( id INTEGER PRIMARY KEY, firstname VARCHAR(200) NOT NULL, lastname VARCHAR(200) NOT NULL, age INTEGER ); -- 修改主鍵為自增 ALTER TABLE user MODIFY id INTEGER AUTO_INCREMENT; -- 設置默認值(自增列通常無需默認值,此處僅演示語法) ALTER TABLE user MODIFY id INTEGER DEFAULT 1; ALTER TABLE user MODIFY id INTEGER AUTO_INCREMENT; -- 重新聲明自增
CREATE TABLE dd(
id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
name VARCHAR(20),
time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO dd(name) VALUES('fhihgifds');
INSERT INTO dd(name) VALUES('steven');
INSERT INTO dd(name) VALUES('anthony');
SELECT * FROM dd;
+----+-----------+---------------------+
| id | name | time |
+----+-----------+---------------------+
| 1 | fhihgifds | 2011-03-27 01:58:46 |
| 2 | steven | 2011-03-27 01:59:35 |
| 3 | anthony | 2011-03-27 02:00:07 |
+----+-----------+---------------------+
最佳實踐:InnoDB 表建議使用業務無關的 BIGINT UNSIGNED AUTO_INCREMENT 作為主鍵,避免業務字段變更導致頁分裂,配合 TIMESTAMP DEFAULT CURRENT_TIMESTAMP 記錄創建時間,簡潔高效。