创建含复合主键的表触发Error Code:1075错误的技术问询
问题解答
你没完全误解错误提示,但没抓准关键细节——MySQL要求AUTO_INCREMENT列必须是某个索引(主键或唯一索引)的最左前缀列,同时确实只能存在一个自增列。你的建表语句触发错误,核心原因是把自增的id放在了复合主键(date,id)的第二位,不满足“自增列需为索引最左前缀”的要求。
两种修正方案
方案1:调整复合主键顺序(推荐)
将id放在复合主键的第一位,让它成为主键的最左前缀列,符合MySQL自增列的规则:
CREATE TABLE `table1` ( `id` int AUTO_INCREMENT NOT NULL, `entity_id` varchar(36) NOT NULL, `entity_type` varchar(36) NOT NULL, `score` decimal(4,3) NOT NULL, `raw` json DEFAULT NULL, `date` date NOT NULL, `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `deleted_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`,`date`), KEY `table1_indx` (`date`,`score`,`entity_type`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
方案2:保留原主键顺序,给id加唯一索引
如果必须保持(date,id)作为主键顺序,可为id单独创建一个唯一索引,让它成为该索引的最左前缀列:
CREATE TABLE `table1` ( `id` int AUTO_INCREMENT NOT NULL, `entity_id` varchar(36) NOT NULL, `entity_type` varchar(36) NOT NULL, `score` decimal(4,3) NOT NULL, `raw` json DEFAULT NULL, `date` date NOT NULL, `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `deleted_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`date`,`id`), UNIQUE KEY `idx_unique_id` (`id`), KEY `table1_indx` (`date`,`score`,`entity_type`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
方案说明
- 方案1是MySQL自增列的常规用法,自增
id作为主键核心列,复合主键同时保证(id,date)的唯一性,维护逻辑简单高效。 - 方案2虽满足语法要求,但自增
id的生成依赖额外的唯一索引,且主键顺序以date开头更适合按日期维度的查询,不过索引维护成本略高,仅在业务强制要求主键顺序时使用。
内容的提问来源于stack exchange,提问作者Kay
相关产品推荐
相关产品推荐

