这个“_ifbk”约束在我的表中做什么?

时间:2010-07-08 12:45:44

标签: mysql ruby-on-rails activerecord foreign-keys constraints

我正在开发一个带有MySQL数据库的Rails Web应用程序。我正在使用迁移来修改架构。我刚遇到一个问题,我在插入新记录时遇到无效的记录错误。相关表格:

users
id | name | email | ...

academic_records
id | scholar_id | gpa | ...

academic_records.scholar_idusers.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,但是按原样,它对我来说没有任何意义。

2 个答案:

答案 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

为什么它会引用自己...我不知道,是时候问你的同事了吗?