2014-09-25 9 views
0

У меня есть этот SQL-код:«ограничение внешнего ключа неправильно формируется»

CREATE TABLE IF NOT EXISTS `deputy`.`Votings` (
    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    `VRSetId` INT UNSIGNED NOT NULL, 
    `LNSetIdOfMeeting` INT UNSIGNED NOT NULL, 
    `VRSetIdOfMeeting` INT UNSIGNED NOT NULL, 
    `meetingId` INT UNSIGNED NOT NULL, 
    PRIMARY KEY (`id`, `VRSetId`), 
    CONSTRAINT `fk_Votings_VotingRulesSets1` 
    FOREIGN KEY (`VRSetId`) 
    REFERENCES `deputy`.`VRSets` (`id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 
    CONSTRAINT `fk_Votings_Meetings1` 
    FOREIGN KEY (`LNSetIdOfMeeting` , `VRSetIdOfMeeting` , `meetingId`) 
    REFERENCES `deputy`.`Meetings` (`LNSetId` , `VRSetId` , `id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 

Там есть первичный ключ состоит из двух полей: «ид» и «VRSetId»; «VRSetId» также является внешним ключом, так как существует таблица «VRSets» с идентификацией отношения «1 к 1» с «Голосованиями». Существует также второй внешний ключ к таблице «Встречи», которая сама имеет первичный ключ, созданный с двумя внешними ключами в дополнение к полю «id» ... Таблица «Встречи» имеет отношения «один ко многим» с «Голосованиями», поэтому «Голосования» в итоге появилось так много ключей ... что прекрасно, поскольку я использую их для доступа к моим данным по-разному. Проблема заключается в том, что, так как я добавил автоматическую incremenent всех полей «ID» - я получаю такую ​​ошибку:

ERROR: Error 1005: Can't create table `deputy`.`Votings` (errno: 150 "Foreign key constraint is incorrectly formed") 

Там есть это «встреча» таблица с аналогичным отформатированными ключами и это прекрасно работает:

CREATE TABLE IF NOT EXISTS `deputy`.`Meetings` (
    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    `LNSetId` INT UNSIGNED NOT NULL, 
    `VRSetId` INT UNSIGNED NOT NULL, 
    `LNSetIdOfCSet` INT UNSIGNED NOT NULL, 
    `CSetId` INT UNSIGNED NOT NULL, 
    PRIMARY KEY (`id`, `LNSetId`, `VRSetId`), 
    CONSTRAINT `fk_Meetings_LegalNumbersSets1` 
    FOREIGN KEY (`LNSetId`) 
    REFERENCES `deputy`.`LNSets` (`id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 
    CONSTRAINT `fk_Meetings_VotingRulesSets1` 
    FOREIGN KEY (`VRSetId`) 
    REFERENCES `deputy`.`VRSets` (`id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 
    CONSTRAINT `fk_Meetings_ConfigurationSets1` 
    FOREIGN KEY (`LNSetIdOfCSet` , `CSetId`) 
    REFERENCES `deputy`.`CSets` (`LNSetId` , `id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 

И последняя таблица связана с «Голосования» (я удалил поля данных во всех таблицах, чтобы сделать его более ясным):

CREATE TABLE IF NOT EXISTS `deputy`.`VRSets` (
    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`id`)) 
ENGINE = InnoDB; 

база данных работает нормально, перед некоторыми незначительными изменениями я сделанный и теперь я не уверен, что происходит ... вся вещь была автоматически сгенерирована MySQL Workbench, и я запускаю скрипт на MariaDB.

+0

Не могли бы вы добавить 'CREATE TABLE' синтаксис таблиц вы ссылающихся? Работает ли код, если вы используете только * один * из внешних ограничений? – BurninLeo

+1

Пожалуйста, поддержите ответ, если это было полезно :) – th3an0maly

ответ

3

Указанная колонка нуждается в индексе. Ваш первичный ключ на meetings таблицы

PRIMARY KEY (`id`, `LNSetId`, `VRSetId`) 

но вы ссылка, как это в votings таблицы:

FOREIGN KEY (`LNSetIdOfMeeting` , `VRSetIdOfMeeting` , `meetingId`) 
REFERENCES `deputy`.`Meetings` (`LNSetId` , `VRSetId` , `id`) 

Порядок столбцов в вопросах индекса, поэтому изменить его

FOREIGN KEY (`meetingId`, `LNSetIdOfMeeting` , `VRSetIdOfMeeting`) 
REFERENCES `deputy`.`Meetings` (`id`, `LNSetId` , `VRSetId`) 

и он будет работать.

  • увидеть его работы вживую в sqlfiddle
+0

Спасибо, я этого не знал. Приказ был изменен автоматически, когда я приводил столбцы «id» вверху, чтобы получить атрибут AI. – smsware

Смежные вопросы