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

MySQL创建INDIVIDUAL_RANKING表报1068多主键错误排查

报错原因

ERROR 1068 (42000): Multiple primary key defined触发原因有三点:

  1. 主键定义不符合MySQL规则:MySQL单表仅允许声明一个主键,你给SID、CID、Edition三个字段单独加了PRIMARY KEY约束,直接触发多主键错误。INDIVIDUAL_RANKING是车手与赛段的关联排名表,需要用三个字段组成的联合主键保证唯一性,而非每个字段单独设为主键。
  2. 外键关联逻辑错误:代码中SID INT REFERENCES STAGE(CID)关联了不存在的字段,STAGE表无CID字段;且STAGE表的唯一标识是(Edition, SID)联合字段,单独关联Edition无法满足外键参照要求。
  3. 字段类型不符合业务规则:Location存储的是整数类型的赛段名次,定义为CHAR(50)文本类型不符合要求。
正确建表方案

按表依赖顺序(先创建被关联表,再创建关联表)编写SQL,所有约束严格匹配给定规则:

-- 车队表
CREATE TABLE TEAM (
    TID INT PRIMARY KEY AUTO_INCREMENT COMMENT '车队ID',
    NameT VARCHAR(50) NOT NULL COMMENT '车队名称',
    YearFoundation INT NOT NULL COMMENT '成立年份',
    OfficeLocation VARCHAR(50) DEFAULT NULL COMMENT '办公地点(可选字段)',
    CHECK (YearFoundation BETWEEN 1900 AND 2000)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 车手表
CREATE TABLE CYCLIST (
    CID INT PRIMARY KEY AUTO_INCREMENT COMMENT '车手ID',
    Name VARCHAR(50) NOT NULL COMMENT '名',
    Surname VARCHAR(50) NOT NULL COMMENT '姓',
    Nationality VARCHAR(50) NOT NULL COMMENT '国籍',
    TID INT DEFAULT NULL COMMENT '所属车队ID',
    BirthYear INT NOT NULL COMMENT '出生年份',
    FOREIGN KEY (TID) REFERENCES TEAM(TID),
    CHECK (BirthYear BETWEEN 1900 AND 2000)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 赛段表
CREATE TABLE STAGE (
    Edition INT NOT NULL COMMENT '赛事届数(递增正整数)',
    SID INT NOT NULL COMMENT '赛段编号(单届内递增正整数)',
    DepartureCity VARCHAR(50) NOT NULL COMMENT '出发城市',
    ArrivalCity VARCHAR(50) NOT NULL COMMENT '到达城市',
    Length INT NOT NULL COMMENT '赛段长度,单位:米',
    DeltaHeight INT NOT NULL COMMENT '累计爬升,单位:米',
    Difficulty INT NOT NULL COMMENT '赛段难度,取值1-10',
    PRIMARY KEY (Edition, SID),
    CHECK (Difficulty BETWEEN 1 AND 10),
    CHECK (Length > 0),
    CHECK (DeltaHeight >= 0),
    CHECK (Edition > 0),
    CHECK (SID > 0)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 个人排名表
CREATE TABLE INDIVIDUAL_RANKING (
    CID INT NOT NULL COMMENT '车手ID',
    SID INT NOT NULL COMMENT '赛段编号',
    Edition INT NOT NULL COMMENT '赛事届数',
    Location INT NOT NULL COMMENT '到达名次(递增正整数)',
    PRIMARY KEY (CID, SID, Edition),
    FOREIGN KEY (CID) REFERENCES CYCLIST(CID),
    FOREIGN KEY (Edition, SID) REFERENCES STAGE(Edition, SID),
    CHECK (Location > 0)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
说明
  • 所有文本字段使用VARCHAR(50),满足最大长度50字符要求,比定长CHAR类型更节省存储空间。
  • 可选字段OfficeLocation设置为允许空值,符合规则要求。
  • 所有数值范围、非空要求通过CHECK约束实现,包括年份区间、难度区间、长度/爬升/名次/编号的正整数要求。
  • 外键严格匹配被关联表的主键结构,避免参照完整性错误。
  • 统一使用InnoDB引擎,支持外键与事务,字符集采用utf8mb4兼容全量字符。
  • 赛段届数Edition、单届赛段编号SID的递增逻辑可通过业务代码或触发器实现,表结构已做好字段类型与合法性约束。

内容的提问来源于stack exchange,提问作者Ali H.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 05:39:32