我正在开发一个带有MySQL数据库的Rails Web应用程序。我正在使用迁移来修改架构。我刚遇到一个问题,我在插入新记录时遇到无效的记录错误。相关表格:
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): ...
我使用Sequel Pro打开了MySQL数据库,发现了这个约束:
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;
我不知道它是如何到达它或它做什么的。为什么表中有自己的ID到自己的外键?我可以删除约束吗?如果是这样,怎么样?我可以理解为什么我要将删除从users.id
级联到academic_records.scholar_id
,但是按原样,它对我来说没有任何意义。
答案 0 :(得分:3)
检查您的迁移文件以查看是否在那里创建了约束,或者您的项目可能正在使用某些插件或RubyGem来执行数据库约束。如果这两个区域都出现空白,则必须手动或通过外部SQL脚本创建。
Rails不会生成或使用数据库约束来强制执行模型关系。如果需要,您必须自己添加数据库参照完整性。
我没有看到任何理由您不能使用以下内容删除此约束:
mysql> ALTER TABLE academic_records DROP FOREIGN KEY `academic_records_ibfk_1`;
答案 1 :(得分:0)
使用DSL进行Rails迁移是不可能的......但是,这并不能阻止人们手动创建外键,或者在迁移中使用execute("SQL HERE")
。
由于我不熟悉MySQL的语法,因此最好的参考是MySQL文档 - 尤其是DROP CONSTRAINT
。
为什么它会引用自己...我不知道,是时候问你的同事了吗?