奇数无法添加外键约束

时间:2018-11-09 13:23:07

标签: mysql foreign-keys ef-core-2.0 mysql-5.7

我有一个奇怪的人。我无法使用以下内容创建表:

表用户已存在于数据库中,仅添加UserTimeZones,但失败。

 CREATE TABLE `Users` (
  `AccessFailedCount` int(11) NOT NULL,
  `EmailConfirmed` bit(1) NOT NULL,
  `Id` char(36) NOT NULL,
  `NormalizedUserName` varchar(256) DEFAULT NULL,
  `NormalizedEmail` varchar(256) DEFAULT NULL,
  PRIMARY KEY (`Id`),
  UNIQUE KEY `UserNameIndex` (`NormalizedUserName`),
  KEY `EmailIndex` (`NormalizedEmail`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `UserTimeZones` (
    `Id` char(36) NOT NULL,
    `UserId` char(36) NOT NULL,
    `TimeZoneOffsetInSeconds` int NOT NULL,
    `LastUpdatedAt` datetime(6) NOT NULL,
    CONSTRAINT `PK_UserTimeZones` PRIMARY KEY (`Id`),
    CONSTRAINT `FK_UserTimeZones_Users_UserId` FOREIGN KEY (`UserId`) REFERENCES `Users` (`Id`) ON DELETE CASCADE
);

SHOW ENGINE INNODB STATUS;

状态显示如下:

  

------------------------最新外键错误

     

2018-11-09 11:26:44 0x7f832c523700的外键约束错误   表五十/ UserTimeZones:

     

删除级联上的外键(UserIdUsersId)引用)

     

在引用表中找不到被引用的索引   列显示为第一列,或表和   引用的表与约束不匹配。

     

请注意,表中的ENUM和SET的内部存储类型已更改   使用> = InnoDB-4.1.12创建的,而旧表中的此类列不能   在新表中被此类列引用。

     

请参阅   http://dev.mysql.com/doc/refman/5.7/en/innodb-foreign-key-constraints.html   正确的外键定义。

所以我有经典的“无法添加外键约束”。

我尝试过的事情:

  • 将Users.Id列放在第一列:不会做任何更改
  • 列类型相同,引擎也相同...
  • 在数据库中没有数据的情况下应用迁移->可行
  • 在没有数据的数据库中运行脚本->仍然不起作用...

出什么问题了?

不确定是否重要,但我使用实体框架核心。

1 个答案:

答案 0 :(得分:0)

https://dev.mysql.com/doc/refman/8.0/en/innodb-foreign-key-constraints.html

  

InnoDB表的外键定义应遵循以下规定   条件:

     

InnoDB允许外键引用任何索引列或索引组   列。但是,在引用的表中,必须有一个索引   其中所引用的列被列为   相同的顺序。

但是奇怪的是,似乎引用表上需要索引:

https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html#foreign-keys-examples

所以尝试在表上添加索引

CREATE TABLE `UserTimeZones` (
    `Id` char(36) NOT NULL,
    `UserId` char(36) NOT NULL,
    `TimeZoneOffsetInSeconds` int NOT NULL,
    `LastUpdatedAt` datetime(6) NOT NULL,
    CONSTRAINT `PK_UserTimeZones` PRIMARY KEY (`Id`),
    INDEX userid_ind (UserId),
    CONSTRAINT `FK_UserTimeZones_Users_UserId` FOREIGN KEY (`UserId`) REFERENCES `Users` (`Id`) ON DELETE CASCADE

);

注意:这就是错误消息的意思。