Не удается добавить ограничение внешнего ключа - не удается найти индекс в указанной таблице - PullRequest
1 голос
/ 02 октября 2019

В настоящее время я пытаюсь добавить таблицу сопоставления, и один из внешних ключей не работает с этим статусом InnoDB:

Не удается найти индекс в ссылочной таблице, где указанные столбцы отображаются как первые столбцы или столбецтипы в таблице и ссылочной таблице не соответствуют ограничениям. Обратите внимание, что тип внутренней памяти ENUM и SET изменился в таблицах, созданных с помощью> = InnoDB-4.1.12, и на такие столбцы в старых таблицах нельзя ссылаться такими столбцами в новых таблицах.

Ссылочная таблица делаетесть первичный ключ. Это в том же Charset / Collation. Он использует InnoDB, и первичный ключ имеет тот же тип, что и FK в новой таблице.

Он имеет индекс с именем PRIMARY, с проверенным столбцом pk и равным # 1.

Этотаблица, на которую ссылаются

CREATE TABLE `oauthtokens` (
  `useridentifier` varchar(100) CHARACTER SET utf8 NOT NULL,
  `guid` varchar(36) CHARACTER SET utf8 DEFAULT NULL,
  `accesstoken` varchar(100) CHARACTER SET utf8 NOT NULL,
  `refreshtoken` varchar(100) CHARACTER SET utf8 NOT NULL,
  `expirytime` varchar(45) CHARACTER SET utf8 NOT NULL,
  `is_master_user` tinyint(1) DEFAULT '0',
  PRIMARY KEY (`useridentifier`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

Это новая таблица, которую я пытаюсь создать

CREATE TABLE `UserRoles` (
    `UserId` varchar(100) NOT NULL,
    `RoleId` int NOT NULL,
    PRIMARY KEY (`UserId`, `RoleId`),
    CONSTRAINT `FK_UserRoles_Roles_RoleId` FOREIGN KEY (`RoleId`) REFERENCES `Roles` (`Id`) ON DELETE CASCADE,
    CONSTRAINT `FK_UserRoles_oauthtokens_UserId` FOREIGN KEY (`UserId`) REFERENCES `oauthtokens` (`useridentifier`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

FK_UserRoles_Roles_RoleId работает, но не FK_UserRoles_oauthtokens_UserId.

1 Ответ

0 голосов
/ 02 октября 2019

Я протестировал это на 8.0.17 и получил ошибку:

ОШИБКА 3780 (HY000): ссылка на столбец 'UserId' и ссылочный столбец 'useridentifier' в ограничении внешнего ключа 'FK_UserRoles_oauthtokens_UserId' несовместимы.

UserRoles.UserId использует стандартный набор символов таблицы utf8mb4, но вы пытаетесь сделать так, чтобы он ссылался на столбец oauthtokens.useridentifier, в котором используется набор символов utf8.

Столбец внешнего ключа и столбец, на который он ссылается, должны использовать один и тот же набор символов и одинаковые параметры сортировки.

Я получил его для работы следующим образом:

ALTER TABLE oauthtokens CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;

Затем добавьте внешний ключ, и он будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...