【问题标题】:MySQL Foreign Key Error Code 1215MySQL 外键错误代码 1215
【发布时间】:2016-02-04 07:00:20
【问题描述】:

我在尝试使用现有表的外键向表中添加列时收到错误消息。以下是两条失败的 SQL 语句:

ALTER TABLE current_teams ADD COLUMN master_team_id INT,
ADD FOREIGN KEY fk_master_team_id(master_team_id) REFERENCES master_teams(id) ON DELETE CASCADE;

ALTER TABLE current_teams ADD COLUMN player_id INT,
ADD FOREIGN KEY fk_player_id(player_id) REFERENCES players(id) ON DELETE CASCADE;

我得到的错误是:错误代码:1215。无法添加外键约束

运行innodb时,更详细的消息说:

2016-02-03 17:22:43 0x3210 表的外键约束错误 lod/#sql-1d58_6:外键 fk_master_team_id(master_team_id) REFERENCES master_teams(id) ON DELETE CASCADE: 无法解析表 名称接近:(id) ON DELETE CASCADE

奇怪的是,在其他表上,添加完全相同的外键可以正常工作。这些语句运行没有问题:

ALTER TABLE team_scouting ADD COLUMN master_team_id INT, 
ADD FOREIGN KEY fk_master_team_id(master_team_id) REFERENCES master_teams(id) ON DELETE CASCADE;
ALTER TABLE team_scouting ADD COLUMN player_id INT, 
ADD FOREIGN KEY fk_player_id(player_id) REFERENCES players(id) ON DELETE CASCADE;

SHOW CREATE TABLE masterteams的结果如下:

'CREATE TABLE `master_teams` (
  `team_name` varchar(45) DEFAULT NULL,
  `owner_name` varchar(45) DEFAULT NULL,
  `max_salary` double DEFAULT NULL,
  `penalty` int(11) DEFAULT ''0'',
  `username` varchar(10) DEFAULT NULL,
  `password` varchar(25) DEFAULT NULL,
  `rights` varchar(10) DEFAULT NULL,
  `email` varchar(100) NOT NULL,
  `id` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=16 DEFAULT CHARSET=latin1'

仅在此“current_teams”表上添加列/外键失败。任何帮助都会很棒!谢谢。

【问题讨论】:

  • 执行SHOW CREATE TABLE master_teams 并将结果添加到您的问题中。
  • 当您尝试运行此更改表时是否存在 master_teams 表?
  • 你不能重复使用相同的约束名称fk_master_team_id。每个约束都需要有一个唯一的名称。
  • @Barmar 我也想到了这个并尝试重命名它,但仍然没有用。此外,我具有相同名称外键的其他表仍然有效。只有这一张表失败了。

标签: mysql foreign-keys


【解决方案1】:

您的master_teams 表不是 InnoDB 表,因此 InnoDB 引擎“无法解析”表名。尝试像这样更新它:

ALTER TABLE master_teams ENGINE = InnoDB;

正如 Barmar 在 cmets 中所说,constraint names do need to be globally unique。如果您不指定名称,MySQL 将为您补一个:

如果给出CONSTRAINTsymbol 子句,则 symbol 值(如果使用),在数据库中必须是唯一的。重复的 symbol 将导致类似于以下内容的错误:ERROR 1005 (HY000): Can't create table 'test.#sql-211d_3' (errno: 121). 如果没有给出子句,或者 symbol 不包含在 CONSTRAINT 关键字之后,约束的名称是自动创建的。

【讨论】:

  • 谢谢 - ENGINE 是问题所在,我不再收到错误消息。但是,即使它们不是唯一的,约束名称也不会引发错误。
  • 我不会试探命运,坚持使用独特的名字。
猜你喜欢
  • 2018-05-13
  • 2015-05-27
  • 2017-09-18
  • 2014-10-22
  • 2016-06-04
  • 2018-09-15
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多