You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

创建含复合主键的表触发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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 10:41:33