【问题标题】:MySQL- [HY000][1005] Can't create table 'dbc18b3536647.results' (errno: 150)MySQL-[HY000][1005] 无法创建表 'dbc18b3536647.results' (errno: 150)
【发布时间】:2019-02-26 05:02:43
【问题描述】:

我在为我的数据库创建一个表时遇到问题。有错误的具体表是'results',

CREATE TABLE results (
  ranking     INTEGER,
  team_name   VARCHAR(100),
  driver_name VARCHAR(100),

  CONSTRAINT pk_results
  PRIMARY KEY (ranking, team_name, driver_name),

  CONSTRAINT fk_results_team_name
  FOREIGN KEY (team_name)
    REFERENCES teams(name),

  CONSTRAINT fk_results_driver_name
  FOREIGN KEY (driver_name)
    REFERENCES drivers(name)
);

我知道只有这部分有问题:

CONSTRAINT fk_results_driver_name
    FOREIGN KEY (driver_name)
    REFERENCES drivers(name)

我没有在我的数据库中插入任何数据,但是所有其他外键都可以正常工作,除了这个。请帮我检查代码。 “结果”表在我的代码的最后。

这是我所有的程序代码。提前致谢!

CREATE TABLE seasons (
  year INTEGER,

  CONSTRAINT pk_seasons_year
  PRIMARY KEY (year)
);

CREATE TABLE tracks (
  name          VARCHAR(100),
  city          VARCHAR(100),
  length        INTEGER,
  num_of_turns  INTEGER,

  CONSTRAINT pk_tracks_name
  PRIMARY KEY (name)
);

CREATE TABLE teams (
  name VARCHAR(100),
  date_created DATE, -- YYYY-MM-DD
  nationality VARCHAR(100),
  website VARCHAR(150),

  CONSTRAINT pk_teams_name
  PRIMARY KEY (name)
);

CREATE TABLE races (
  id                        INTEGER,
  season_year               INTEGER,
  date                      DATE,
  laps                      INTEGER,
  teams_line_up             VARCHAR(100),
  teams_name_classification VARCHAR(100),
  ranking_classification    INTEGER,

  CONSTRAINT pk_races
  PRIMARY KEY (id, season_year, teams_line_up, teams_name_classification,
               ranking_classification),

  CONSTRAINT fk_races_lineup
  FOREIGN KEY (teams_line_up)
  REFERENCES teams(name),

  CONSTRAINT fk_races_teamname_classification
  FOREIGN KEY (teams_name_classification)
    REFERENCES teams(name)
);

CREATE TABLE cars (
  model   VARCHAR(100),
  height  INTEGER,
  length  INTEGER,
  width   INTEGER,
  weight  INTEGER,

  CONSTRAINT pk_cars_model
  PRIMARY KEY (model)
);

CREATE TABLE sponsors (
  name    VARCHAR(100),
  website VARCHAR(150),
  address VARCHAR(200),
  team_sponsored VARCHAR(50),

  CONSTRAINT pk_sponsors_name
  PRIMARY KEY (name),

  CONSTRAINT fk_sponsors_team_sponsored
  FOREIGN KEY (team_sponsored)
  REFERENCES teams (name)
);


CREATE TABLE members (
  ssn INTEGER,
  name VARCHAR(100),
  nationality VARCHAR(100),
  team_name VARCHAR(100),
  season_year INTEGER,

  CONSTRAINT pk_members
  PRIMARY KEY (ssn, team_name),

  CONSTRAINT fk_members_team_name
  FOREIGN KEY (team_name)
    REFERENCES teams(name),

  CONSTRAINT fk_members_season
  FOREIGN KEY (season_year)
    REFERENCES seasons(year)
);

CREATE TABLE team_chief (
  ssn INTEGER,
  name VARCHAR(100),
  nationality VARCHAR(100),
  team_name VARCHAR(100),
  season_year INTEGER,

  CONSTRAINT pk_team_chief
  PRIMARY KEY (ssn, team_name),

  CONSTRAINT fk_team_chief_ssn
  FOREIGN KEY (ssn)
    REFERENCES members(ssn),

  CONSTRAINT fk_team_chief_name
  FOREIGN KEY (team_name)
    REFERENCES teams(name),

  CONSTRAINT fk_team_chief_season
  FOREIGN KEY (season_year)
    REFERENCES seasons(year)
);

CREATE TABLE drivers (
  ssn INTEGER,
  name VARCHAR(100),
  nationality VARCHAR(100),
  team_name VARCHAR(100),
  season_year INTEGER,

  CONSTRAINT pk_drivers
  PRIMARY KEY (ssn, name, team_name),

  CONSTRAINT fk_drivers_ssn
  FOREIGN KEY (ssn)
    REFERENCES members(ssn),

  CONSTRAINT fk_drivers_name
  FOREIGN KEY (team_name)
    REFERENCES teams(name),

  CONSTRAINT fk_drivers_season
  FOREIGN KEY (season_year)
    REFERENCES seasons(year)
);

CREATE TABLE head_drivers (
  ssn INTEGER,
  name VARCHAR(100),
  nationality VARCHAR(100),
  team_name VARCHAR(100),
  season_year INTEGER,

  CONSTRAINT pk_head_drivers
  PRIMARY KEY (ssn, team_name),

  CONSTRAINT fk_head_drivers_ssn
  FOREIGN KEY (ssn)
    REFERENCES members(ssn),

  CONSTRAINT fk_head_drivers_name
  FOREIGN KEY (team_name)
    REFERENCES teams(name),

  CONSTRAINT fk_head_drivers_season
  FOREIGN KEY (season_year)
    REFERENCES seasons(year)
);

CREATE TABLE reserve_drivers (
  ssn INTEGER,
  name VARCHAR(100),
  nationality VARCHAR(100),
  team_name VARCHAR(100),
  season_year INTEGER,

  CONSTRAINT pk_reserve_drivers
  PRIMARY KEY (ssn, team_name),

  CONSTRAINT fk_reserve_drivers_ssn
  FOREIGN KEY (ssn)
    REFERENCES members(ssn),

  CONSTRAINT fk_reserve_drivers_name
  FOREIGN KEY (team_name)
    REFERENCES teams(name),

  CONSTRAINT fk_reserve_drivers_season
  FOREIGN KEY (season_year)
    REFERENCES seasons(year)
);

CREATE TABLE results (
  ranking     INTEGER,
  team_name   VARCHAR(100),
  driver_name VARCHAR(100),

  CONSTRAINT pk_results
  PRIMARY KEY (ranking, team_name, driver_name),

  CONSTRAINT fk_results_team_name
  FOREIGN KEY (team_name)
    REFERENCES teams(name),

  CONSTRAINT fk_results_driver_name
  FOREIGN KEY (driver_name)
    REFERENCES drivers(name)
);

【问题讨论】:

  • 错误消息是自我描述的:Missing index for constraint 'fk_results_driver_name' in the referenced table 'drivers' 来自drivers 表的PK 是PRIMARY KEY (ssn, name, team_name),
  • 您好,我是一名正在学习数据库的学生,但对这些概念仍然不太了解。请问什么是索引,为什么我的约束需要一个?为什么我的其他外键没有这个问题?
  • "Why didn't I have this problems for my other foreign keys ?" 因为您引用了具有 PK 的列,例如:FK CONSTRAINT fk_reserve_drivers_season FOREIGN KEY (season_year) REFERENCES seasons(year) 具有 CREATE TABLE seasons ( year INTEGER, >>>CONSTRAINT pk_seasons_year PRIMARY KEY (year)<<< );

标签: mysql sql database pycharm mysql-error-1005


【解决方案1】:

您在外键中引用的列必须被索引。所以需要在drivers表的name列上添加索引:

ALTER TABLE drivers ADD INDEX (name);

请注意,虽然这不是严格要求,但外键通常引用另一个表的主键。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-09
    • 2016-10-12
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    相关资源
    最近更新 更多