我正在使用 MySQL Workbench 制作一个小型数据库。我有一个名为“Immobili”的主表,它的主键由四列组成:(Comune、Via、Civico、Immobile)。

现在,我还有其他三个表,它们具有相同的主键(Comune、Via、Civico、Immobile),但这些字段也引用表 Immobili。

第一个问题:我可以创建一个主键同时也是一个外键吗?

第二个问题:当我尝试导出更改时,它显示:在服务器中执行SQL脚本

# ERROR: Error 1005: Can't create table 'dbimmobili.condoni' (errno: 150)

CREATE  TABLE IF NOT EXISTS `dbimmobili`.`Condoni` (

  `ComuneImmobile` VARCHAR(50) NOT NULL ,
  `ViaImmobile` VARCHAR(50) NOT NULL ,
  `CivicoImmobile` VARCHAR(5) NOT NULL ,
  `InternoImmobile` VARCHAR(3) NOT NULL ,
  `ProtocolloNumero` VARCHAR(15) NULL ,
  `DataRichiestaSanatoria` DATE NULL ,
  `DataSanatoria` DATE NULL ,
  `SullePartiEsclusive` TINYINT(1) NULL ,
  `SullePartiComuni` TINYINT(1) NULL ,
  `OblazioneInEuro` DOUBLE NULL ,
  `TecnicoOblazione` VARCHAR(45) NULL ,
  `TelefonoTecnico` VARCHAR(15) NULL ,
  INDEX `ComuneImmobile` (`ComuneImmobile` ASC) ,
  INDEX `ViaImmobile` (`ViaImmobile` ASC) ,
  INDEX `CivicoImmobile` (`CivicoImmobile` ASC) ,
  INDEX `InternoImmobile` (`InternoImmobile` ASC) ,

  PRIMARY KEY (`ComuneImmobile`, `ViaImmobile`, `CivicoImmobile`, `InternoImmobile`) ,

  CONSTRAINT `ComuneImmobile`
    FOREIGN KEY (`ComuneImmobile` )
    REFERENCES `dbimmobili`.`Immobile` (`ComuneImmobile` )
    ON DELETE CASCADE
    ON UPDATE CASCADE,

  CONSTRAINT `ViaImmobile`
    FOREIGN KEY (`ViaImmobile` )
    REFERENCES `dbimmobili`.`Immobile` (`ViaImmobile` )
    ON DELETE CASCADE
    ON UPDATE CASCADE,

  CONSTRAINT `CivicoImmobile`
    FOREIGN KEY (`CivicoImmobile` )
    REFERENCES `dbimmobili`.`Immobile` (`CivicoImmobile` )
    ON DELETE CASCADE
    ON UPDATE CASCADE,

  CONSTRAINT `InternoImmobile`
    FOREIGN KEY (`InternoImmobile` )
    REFERENCES `dbimmobili`.`Immobile` (`InternoImmobile` )
    ON DELETE CASCADE
    ON UPDATE CASCADE
) ENGINE = InnoDB

显示引擎状态:

表 dbimmobili/valutazionimercato 的外键约束错误:

在引用表中找不到索引,其中引用的列显示为第一列,或者表中的列键入,引用表中的表格与约束不匹配。请注意,枚举的内部存储类型和集合在用> = innodb-4.1.12创建的表中更改,并且旧表中的此类列无法通过新表中的此类列来引用。

我哪里做错了?

有帮助吗?

解决方案

创建外键约束时,MySQL 需要引用表和被引用表上都有可用的索引。如果引用表上的索引不存在,则会自动创建,但引用表上的索引需要手动创建(来源)。你的似乎不见了。

测试用例:

CREATE TABLE tbl_a (
    id int PRIMARY KEY,
    some_other_id int,
    value int
) ENGINE=INNODB;
Query OK, 0 rows affected (0.10 sec)

CREATE TABLE tbl_b (
    id int PRIMARY KEY,
    a_id int,
    FOREIGN KEY (a_id) REFERENCES tbl_a (some_other_id)
) ENGINE=INNODB;
ERROR 1005 (HY000): Can't create table 'e.tbl_b' (errno: 150)

但是如果我们添加一个索引 some_other_id:

CREATE INDEX ix_some_id ON tbl_a (some_other_id);
Query OK, 0 rows affected (0.11 sec)
Records: 0  Duplicates: 0  Warnings: 0

CREATE TABLE tbl_b (
    id int PRIMARY KEY,
    a_id int,
    FOREIGN KEY (a_id) REFERENCES tbl_a (some_other_id)
) ENGINE=INNODB;
Query OK, 0 rows affected (0.06 sec)

在大多数情况下,这通常不是问题,因为引用的字段通常是引用表的主键,并且主键会自动建立索引。

其他提示

仔细检查外键具有完全相同的类型,你在这个表已经得到了现场。例如,两者都应该是整数(10),或VARCHAR(8),字符的连号。

我意识到这是旧的文章,但它在谷歌排名高,所以我增加了我想通了,我的问题。如果你有表类型(例如MyISAM和InnoDB)的混合,就会得到这个错误也是如此。在这种情况下,InnoDB的是默认的表型,但一个表需要全文检索,因此迁移到MyISAM数据。在这种情况下,你不能创建在InnoDB表的外键引用的MyISAM表。

如果您的密钥是CHAR / VARCHAR或该类型的东西,另一个可能的问题是不同的排序规则。检查字符集是相同的。

我有这个错误,发现在我的情况下,错误的原因。 我还是要回答这个老帖子,因为它在谷歌排名相当高。

这两个我想链接栏的变量是整数,但整数的人有“无符号”查了。简单地取消检查固定我的错误。

我得到一个相同的错误。我发现了解决方案,我已经建立了主表作为BIGINT UNSIGNED主键和被声明为在第二个表,因为只有BIGINT外键。

当我宣布我的外键BIGINT UNSIGED在第二个表,一切运行良好,甚至不需要任何索引创建。

因此,它是主键和外键之间的数据类型不匹配:)

我有完全相同的问题,但解决我的问题是完全不同的。我有,其他地方在数据库中,具有相同名称的外键。引起错误1005

重命名我的外键更具体的东西到这种情况解决了这个问题。

  1. 确保两个表使用相同的引擎类型。
  2. 确保您正在索引的字段具有相同的类型和长度。

在我的情况下误差是由于referencing表是MyISAM其中作为referring表是InnoDB

Converted解决问题MyISAM to InnoDB表引擎我。

ALTER TABLE table_name ENGINE=InnoDB;

我没有信誉没有了投票史蒂夫的建议,但它解决了我的问题。

在我的情况下,我接收此错误,因为其中使用不同的数据库引擎创建的两个表 - 一个是InnoDB和其他的MyISAM。

可以改变使用的数据库类型:ALTER TABLE吨ENGINE = MYISAM;

HTTP://dev.mysql。 COM / DOC / refman / 5.1 / EN /存储发动机setting.html

兼顾字符集 COLLATE 当你创建一个表参数。的外键方面类似的东西的问题:

CREATE TABLE yourTableName (
....
....
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

在我的情况下,我couldn't创建具有外键引用该表。首先,我得到了错误代码1005几乎什么都不说。然后的我添加COLLATE 并终于错误消息抱怨字符集。

Error Code: 1253. COLLATION 'utf8_unicode_ci' is not valid for CHARACTER SET 'latin1'

在该修正我的问题解决了。

这不是你的具体情况,但值得注意的位置给其他人,如果你尝试引用表中的某些字段不属于该表的整个主键,就会出现这种错误。显然,这是不允许的。

如果任何人有这个错误看似中规中矩FK / PK关系,您使用的可视化工具,尝试删除有问题的FK列和工具重新添加。直到我重新规划了其清理问题的连接,我不断收到此错误。

当一个有2列主键它们构成了一个复合主键因此必须确保在正被引用的表也有相同的数据类型的2列。

对于我来说,我尝试到正规的索引字段的子表匹配,在父表的主键,默认情况下这些的MySQL前端图形用户界面像续集专业设置主键为无符号,让你拥有确保子表字段是无符号的太(除非这些字段可能包含负整数,然后确保他们双方签字)。

MySQL是出了名的暴躁,尤其是关于外键和触发器。我现在是在精细tunning这样一个数据库,跑的过程中了这个问题。这是不言自明或直观的,因此在这里不言而喻:

除了检查,如果你想在关系中引用的两列具有相同的数据类型,还必须确保你所引用的表中的列是索引。如果您使用的是MySQL工作台,选择选项卡“索引”旁边的“列”,并确保通过外键引用的列是一个索引。如果没有,创建一个,命名为一些有意义的事情,并给它的类型“索引”。

一个好的做法是清理涉及关系表,以确保以前的尝试没有创造你不想索引或需要。

我希望它的帮助下,一些MySQL的错误狂揽跟踪。

  

第一个问题:我可以做一个主键,这也是一个外键

是。事实上,对于MySQL的工作台我已经得到了只使用主键的外键的习惯。真的减少了接收到的随机错误,如ERR:150在问题陈述

  

<强>#ERROR:错误1005:无法创建表 'dbimmobili.condoni'(错误:150)

这确实与指标的东西,或者更具体怎么MySQL工作台解释,并与他们的作品。它如果您在模型中(例如外键,索引,列订单)都在同一个正向工程操作,发生很大的变化真的会很困惑,特别是如果已经有另一端的数据库。举例来说,我不认为会自动创建索引,其中删除一个外键后会自动删除。

下面是我做过什么来修复错误的接收。请注意,这似乎很麻烦,但相比于时间我使用其他方法所花费的金额,其实并非如此。

<强> 1。使所有外键在查找表(在1的1对多)的主键。

在我的情况下,这涉及改变ID作为PK到的用户名中tbl_users,在tbl_companies用户名和公司,并且在tbl_company_contacts用户名和公司和联系。这是一个应用程序的多个用户输入多个联系人,允许重叠和其他用户的联系人hidding。

<强> 2。删除所有图的关系和所有表索引不属于主键。

这可以解决大部分的那些真正被越野车的MySQL工作台导致指数的问题。

第3。如果你这样做,从开始到结束,删除模式的服务器上,以便MySQL工作台不弄不清楚现有的指数法和模型中没有出现过(问题BBY指数和外键关系引起的,不是单独的索引)。

这减少了很多的决定的DB,服务器和MySQL工作台必须做出很大。这些关于如何转发工程师东西决策复杂化和智能化,但不完美。

<强> 4。现在,我认为这又回到了起点(一般设计到太快,而不需要台阶的过程之后)。我仍然有所有的表,但它们是干净的,在这个阶段。现在你只要:

首先,正向工程,以确保公正的表(无关系)按预期方式工作。

请关系链向下通的主键,从顶部开始最表(我我的情况下tbl_users到tbl_companies)。每个关系之后,一直在向前发展工程,以确保它的运行的,然后保存模型并关闭,然后反向工程的模型,以确保它的需要的。这使您可以快速找出问题,因为他们出现在我的情况下,剩下的由老使用索引中删除外键(2-3发生次)。

和tadda,在这里需要回是

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top