1

Я работаю над веб-приложением Rails с базой данных MySQL. Я использую миграции для изменения схемы. Я просто столкнулся с проблемой, когда у меня ошибка с ошибкой при вставке новой записи. Соответствующие таблицы:Что это за ограничение «_ifbk» в моей таблице?

users 
id | name | email | ... 

academic_records 
id | scholar_id | gpa | ... 

academic_records.scholar_id является внешним ключом ссылкой на users.id, но я не размещали какие-либо другие ограничения в этой таблице. Ошибка выглядит следующим образом:

Mysql::Error: Cannot add or update a child row: a foreign key constraint fails 
(`my_db`.`academic_records`, CONSTRAINT `academic_records_ibfk_1` 
FOREIGN KEY (`id`) REFERENCES `academic_records` (`id`) ON DELETE CASCADE): ... 

Я открыл базу данных MySQL с помощью Sequel Pro и нашел это ограничение:

CREATE TABLE `academic_records` (
    `gpa` varchar(10) DEFAULT NULL, 
    ... 
    PRIMARY KEY (`id`), 
    KEY `index_academic_records_on_scholar_id` (`scholar_id`), 
    CONSTRAINT `academic_records_ibfk_1` FOREIGN KEY (`id`) 
    REFERENCES `academic_records` (`id`) ON DELETE CASCADE 
) ENGINE=InnoDB AUTO_INCREMENT=177 DEFAULT CHARSET=utf8; 

Я понятия не имею, как он получил там или что он делает. Почему таблица должна иметь внешний ключ от своего собственного идентификатора? Можно ли удалить ограничение? Если да, то как? Я мог понять, почему я хотел бы каскадировать удаления от users.id до academic_records.scholar_id, но, как есть, для меня это не имеет смысла.

+0

После некоторого осмотра я нашел одинаково названные ограничения на других таблицах, но они имели разумное внешний ключ отношения - - такие вещи, как удаление сообщений пользователем при удалении пользователя. –

ответ

3

Проверьте файлы миграции, чтобы узнать, существует ли там ограничение, или, возможно, в вашем проекте используется какой-либо плагин или RubyGem, который что-то делает с ограничениями базы данных. Если обе области заполняют пробелы, они должны быть созданы вручную или внешним SQL-скриптом.

Rails не создает или не использует ограничения базы данных для обеспечения соответствия отношений модели. Референциальная целостность базы данных - это то, что вам нужно добавить, если вы этого хотите.

Я не вижу никаких причин, почему вы не можете отказаться от этого ограничения с помощью:

mysql> ALTER TABLE academic_records DROP FOREIGN KEY `academic_records_ibfk_1`; 
+0

отлично работал –

0

Этот вид вещей невозможен благодаря миграции Rails с использованием DSL ... однако это не мешает людям создавать внешний ключ вручную или использовать в вашей миграции execute("SQL HERE").

Поскольку я незнакомый с синтаксисом MySQL, ваша лучшая ссылка - это документация по MySQL, в частности DROP CONSTRAINT.

Почему он ссылается на себя ... Я понятия не имею, время, чтобы спросить ваших коллег?

+0

Увы, коллег не виноват, так как я единственный, кто кодирует проект. Я определенно не делал этого вручную. Я думаю, что это могло бы иметь какое-то отношение к ': dependent =>: destroy' в одной из ассоциаций моей модели. –

+0

зависимый destroy не добавит fk, это всего лишь немного кода Ruby. –