Нечетный Невозможно добавить ограничение внешнего ключа - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть странный. Я не могу создать таблицу, используя следующее:

Таблица Users уже существует в БД , необходимо добавить только 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 для правильного определения внешнего ключа.

Итак, у меня есть классическое «Невозможно добавить ограничение внешнего ключа».

Что я пробовал:

  • Размещение столбца Users.Id в качестве первого столбца: ничего не меняется
  • Типы колонок одинаковые, двигатели тоже ...
  • Применение миграции без данных в БД -> это работает
  • Запуск сценария в БД без данных -> все еще не работает ...

В чем проблема?

Не уверен, что это важно, но я использую ядро ​​Entity Framework.

1 Ответ

0 голосов
/ 09 ноября 2018

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

);

Примечание. Это сообщение об ошибке.

...