【问题标题】:Errors 1005 and 150 in MySQLMySQL 中的错误 1005 和 150
【发布时间】:2019-11-18 00:03:21
【问题描述】:

我有两张桌子。

CREATE TABLE `languages` (
  `language_id` tinyint(1) unsigned NOT NULL AUTO_INCREMENT,
  `language_abbrv` char(2) NOT NULL,
  `language_english` varchar(45) NOT NULL,
  `language_local` varchar(45) NOT NULL,
  PRIMARY KEY (`language_id`),
  UNIQUE KEY `language_id_UNIQUE` (`language_id`),
  UNIQUE KEY `language_abbrv_UNIQUE` (`language_abbrv`),
  UNIQUE KEY `language_name_UNIQUE` (`language_english`),
  UNIQUE KEY `language_local_UNIQUE` (`language_local`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

CREATE TABLE `layouts` (
  `layout_id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
  `platform_id` tinyint(3) unsigned NOT NULL,
  `language_id` tinyint(1) unsigned NOT NULL,
  `layout_name` varchar(45) NOT NULL,
  PRIMARY KEY (`layout_id`),
  UNIQUE KEY `layout_id_UNIQUE` (`layout_id`),
  KEY `idx_layouts_platform_id` (`platform_id`),
  CONSTRAINT `fk_layouts_platform_id` FOREIGN KEY (`platform_id`) REFERENCES `platforms` (`platform_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;

当我尝试在“布局”上创建引用“语言 ID”列上“语言”的外键时,我不断收到“错误 1005:无法创建表(错误号:150)”错误。我看不出问题出在哪里,错误并没有告诉我太多。我在这里做错了什么?

【问题讨论】:

  • 请分享你的platform建表脚本
  • 当我尝试在“布局”上创建外键时,引用“language_id”列上的“语言”:您的脚本实际上并没有尝试这样做。请向我们展示您的尝试。

标签: mysql foreign-keys


【解决方案1】:

当我尝试在“布局”上创建引用“语言 ID”列中“语言”的外键时,我不断收到 [...] 错误。

首先:您向我们展示的脚本实际上并未尝试创建该外键。

但无论如何:如果是,那么它将失败,因为您的表使用不同的 MySQL 引擎:languages 使用 MyISAM,而 layouts 使用 InnoDB。两个表必须使用相同的引擎来创建外键。

Demo on DB Fiddle(可以将第一个表的引擎改回MyISAM产生错误)。

Documentation reference

父子表必须使用相同的存储引擎,不能定义为临时表。

【讨论】:

  • MySQL Workbench 在创建新表时默认使用 MyISAM。我将不得不研究如何阻止这种情况。
  • @posfan12:作为一种解决方法,您可以在创建表时明确指定要使用的引擎。
【解决方案2】:

除了 GMB 的回答之外,如果您尝试创建语言 ID 的外键,请添加此脚本。

CONSTRAINT `fk_layouts_language_id` FOREIGN KEY (`language_id`) REFERENCES `languages` (`language_id`) ON       DELETE NO ACTION ON UPDATE NO ACTION,

假设您已经创建了platform(same engine=InnoDb),您可以使用以下脚本。

CREATE TABLE `layouts` (
  `layout_id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
  `platform_id` tinyint(3) unsigned NOT NULL,
  `language_id` tinyint(1) unsigned NOT NULL,
  `layout_name` varchar(45) NOT NULL,
  PRIMARY KEY (`layout_id`),
  UNIQUE KEY `layout_id_UNIQUE` (`layout_id`),
  KEY `idx_layouts_platform_id` (`platform_id`),
  CONSTRAINT `fk_layouts_language_id` FOREIGN KEY (`language_id`) REFERENCES `languages` (`language_id`) ON         DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `fk_layouts_platform_id` FOREIGN KEY (`platform_id`) REFERENCES `platforms` (`platform_id`) ON         DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;

dbfiddle

【讨论】:

    猜你喜欢
    • 2018-04-14
    • 1970-01-01
    • 2012-07-21
    • 2012-06-22
    • 2016-07-27
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    • 1970-01-01
    相关资源
    最近更新 更多