Что это ограничение "_ifbk" делает в моей таблице? - PullRequest
1 голос
/ 08 июля 2010

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

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, но как есть, для меня это не имеет смысла.

Ответы [ 2 ]

3 голосов
/ 08 июля 2010

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

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

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

mysql> ALTER TABLE academic_records DROP FOREIGN KEY `academic_records_ibfk_1`;
0 голосов
/ 08 июля 2010

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

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

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

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