Py学习  »  DATABASE

mysql-错误1215:无法添加外键约束[重复]

zeldafan • 5 年前 • 3167 次点击  

我正试图将我的新模式转发到我的数据库服务器上,但我不明白为什么会出现这个错误。我试图在这里搜索答案,但我所找到的一切都表明,要么将db引擎设置为innodb,要么确保我试图用作外键的键是它们自己表中的主键。如果我没弄错的话,这两件事我都做过。你们还能提供什么帮助吗?

Executing SQL script in server

ERROR: Error 1215: Cannot add foreign key constraint

-- -----------------------------------------------------
-- Table `Alternative_Pathways`.`Clients_has_Staff`
-- -----------------------------------------------------

CREATE  TABLE IF NOT EXISTS `Alternative_Pathways`.`Clients_has_Staff` (
  `Clients_Case_Number` INT NOT NULL ,
  `Staff_Emp_ID` INT NOT NULL ,
  PRIMARY KEY (`Clients_Case_Number`, `Staff_Emp_ID`) ,
  INDEX `fk_Clients_has_Staff_Staff1_idx` (`Staff_Emp_ID` ASC) ,
  INDEX `fk_Clients_has_Staff_Clients_idx` (`Clients_Case_Number` ASC) ,
  CONSTRAINT `fk_Clients_has_Staff_Clients`
    FOREIGN KEY (`Clients_Case_Number` )
    REFERENCES `Alternative_Pathways`.`Clients` (`Case_Number` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_Clients_has_Staff_Staff1`
    FOREIGN KEY (`Staff_Emp_ID` )
    REFERENCES `Alternative_Pathways`.`Staff` (`Emp_ID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB

SQL脚本执行完成:语句:7成功,1失败

这是父表的sql。

CREATE  TABLE IF NOT EXISTS `Alternative_Pathways`.`Clients` (
  `Case_Number` INT NOT NULL ,
  `First_Name` CHAR(10) NULL ,
  `Middle_Name` CHAR(10) NULL ,
  `Last_Name` CHAR(10) NULL ,
  `Address` CHAR(50) NULL ,
  `Phone_Number` INT(10) NULL ,
  PRIMARY KEY (`Case_Number`) )
ENGINE = InnoDB

CREATE  TABLE IF NOT EXISTS `Alternative_Pathways`.`Staff` (
  `Emp_ID` INT NOT NULL ,
  `First_Name` CHAR(10) NULL ,
  `Middle_Name` CHAR(10) NULL ,
  `Last_Name` CHAR(10) NULL ,
  PRIMARY KEY (`Emp_ID`) )
ENGINE = InnoDB
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/39827
 
3167 次点击  
文章 [ 30 ]  |  最新文章 5 年前
SherylHohman WagnerAlbJr
Reply   •   1 楼
SherylHohman WagnerAlbJr    7 年前

我也有同样的问题。
我解决了这个问题:

我在
primary key: (id int(11) unsigned NOT NULL AUTO_INCREMENT)

我在尝试在模式生成器中导入表后发现了此解决方案。如果对你有用,告诉我!

祝你好运!

费利佩·特西奥

Thisaru Guruge Yacine Richthof
Reply   •   2 楼
Thisaru Guruge Yacine Richthof    10 年前

我有同样的问题,我的解决方案:

之前:

CREATE TABLE EMPRES
( NoFilm smallint NOT NULL

  PRIMARY KEY (NoFilm)

  FOREIGN KEY (NoFilm) REFERENCES cassettes

);

解决方案:

CREATE TABLE EMPRES
(NoFilm smallint NOT NULL REFERENCES cassettes,

 PRIMARY KEY (NoFilm)

);

希望能有所帮助;)

Alex
Reply   •   3 楼
Alex    11 年前

我在尝试添加FK时遇到了同样的错误。在我的例子中,问题是由fk表的pk引起的,该pk被标记为unsigned。

user2975399
Reply   •   4 楼
user2975399    11 年前

在使用laravel 4时,我遇到了一个陷阱:“错误1215:无法添加外键约束”,特别是在使用jeffreyway的laravel4生成器时。

在laravel 4中,您可以使用jeffreyway的生成器生成迁移文件来逐个创建表,也就是说,每个迁移文件生成一个表。 您必须意识到,每个迁移文件都是用文件名中的时间戳生成的,该时间戳为文件提供了一个顺序。生成顺序也是启动Artisan cli命令“php Artisan migrate”时的迁移操作顺序。 因此,如果一个文件要求外键约束引用一个将在后一个文件中生成但尚未生成的键,则会触发错误1215。 在这种情况下,您需要做的是调整迁移文件生成的顺序。按正确顺序生成新文件,复制内容,然后删除无序的旧文件。

robsch
Reply   •   5 楼
robsch    8 年前

在我的例子中,我使用 SET FOREIGN_KEY_CHECKS=0 然后 SET FOREIGN_KEY_CHECKS=1 之后。当我去重新装桌子的时候 error 1215 . 问题是数据库中的另一个表有一个外键指向我已删除并正在重新加载的表。重新加载过程的一部分涉及更改其中一个字段的数据类型,这会使另一个表中的外键无效,从而触发 错误1215 . 我通过删除另一个表,然后用相关字段的新数据类型重新加载另一个表,解决了这个问题。

Carlos Laspina
Reply   •   6 楼
Carlos Laspina    7 年前

检查表的排序规则,使用 SHOW TABLE STATUS 您可以检查有关表的信息,包括排序规则。

两个表必须具有相同的排序规则。

发生在我身上。

Community Oliver
Reply   •   7 楼
Community Oliver    8 年前

错误1215是一个恼人的错误。 Explosion Pill's answer 涵盖基本知识。你要确保从那里开始。然而,还有更多更微妙的情况需要注意:

例如,当您尝试链接不同表的主键时,请确保提供正确的 ON UPDATE ON DELETE 选项。例如。:

...
PRIMARY KEY (`id`),
FOREIGN KEY (`id`) REFERENCES `t` (`other_id`) ON DELETE SET NULL
....

不会飞,因为主键(例如 id )不可能是 NULL

我确信,在添加此类约束时,还有更多类似的微妙问题,这就是为什么遇到约束错误时,总是确保约束及其含义在当前上下文中有意义。祝你的错误1215好运!

naXa
Reply   •   8 楼
naXa    9 年前

对于其他人,同样的错误可能并不总是由于列类型不匹配造成的,您可以通过发出命令来查找有关mysql foriegn key错误的更多信息

SHOW ENGINE INNODB STATUS;

您可能会在打印的消息顶部发现一个错误,如

在引用的表中找不到 引用列显示为第一列或列类型 在表中与引用的表不匹配。

pbz Explosion Pills
Reply   •   9 楼
pbz Explosion Pills    7 年前

可能出现外键约束错误的原因:

  1. 您没有在所有表上使用innodb作为引擎。
  2. 您试图引用目标表上不存在的键。确保它是 钥匙 在另一个表上(它可以是主键或唯一键)
  3. 列的类型不同(例外情况是引用表中的列可以为空)。
  4. 如果pk/fk是varchar,请确保这两个文件的排序规则相同。

更新:

  1. 其中一个原因可能是您使用的列 ON DELETE SET NULL 未定义为空。因此,请确保该列设置为默认空。

看看这些。

Ike Walker
Reply   •   10 楼
Ike Walker    12 年前

我猜是的 Clients.Case_Number 和/或 Staff.Emp_ID 不是完全相同的数据类型 Clients_has_Staff.Clients_Case_Number Clients_has_Staff.Staff_Emp_ID .

父表中的列可能是 INT UNSIGNED ?

两个表中的数据类型必须完全相同。