我有一个奇怪的人。我无法使用以下内容创建表:
表用户已存在于数据库中,仅添加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:
删除级联上的外键(
UserId
(Users
(Id
)引用)在引用表中找不到被引用的索引 列显示为第一列,或表和 引用的表与约束不匹配。
请注意,表中的ENUM和SET的内部存储类型已更改 使用> = InnoDB-4.1.12创建的,而旧表中的此类列不能 在新表中被此类列引用。
请参阅 http://dev.mysql.com/doc/refman/5.7/en/innodb-foreign-key-constraints.html 正确的外键定义。
所以我有经典的“无法添加外键约束”。
我尝试过的事情:
出什么问题了?
不确定是否重要,但我使用实体框架核心。
答案 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
);
注意:这就是错误消息的意思。