結論:CREATE INDEX 不能創建主鍵,必須用 ALTER TABLE tbl ADD PRIMARY KEY (col) 或建表時 PRIMARY KEY (col)。
| 引擎 | 默認限制 | 開啟 innodb_large_prefix 後 |
|---|---|---|
| MyISAM | 1000 字節 | — |
| InnoDB | 767 字節 | 3072 字節(需 ROW_FORMAT=DYNAMIC/COMPRESSED + innodb_file_per_table=ON) |
-- InnoDB 767 字節邊界
CREATE TABLE t (c VARCHAR(255) CHARSET utf8mb4, INDEX idx_c(c(255))); -- 255*4=1020 > 767 → 報錯
CREATE TABLE t (c VARCHAR(255) CHARSET utf8mb4, INDEX idx_c(c(191))); -- 191*4=764 ✓
-- 開啟 large_prefix 後
SET GLOBAL innodb_large_prefix=ON;
CREATE TABLE t (c VARCHAR(255) CHARSET utf8mb4, INDEX idx_c(c(255))) ROW_FORMAT=DYNAMIC; -- ✓
ROW_FORMAT=DYNAMIC + innodb_large_prefix=ON(MySQL 5.7.7+ 默認開啟)。utf8mb4,前綴長度按「字符數」計算,留 10% 餘量。BIGINT AUTO_INCREMENT 或 UUID_TO_BIN(),避免業務字段變長導致二級索引膨脹。