代码之家  ›  专栏  ›  技术社区  ›  James A. Rosen

这个“\u ifbk”约束在我的表中做什么?

  •  1
  • James A. Rosen  · 技术社区  · 15 年前

    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): ...
    

    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到它自己的外键?我可以取消限制吗?如果是,怎么做?我知道我为什么要从 用户id 学术记录.scholar\u id ,但事实上,这对我来说毫无意义。

    2 回复  |  直到 15 年前
        1
  •  3
  •   John Topley    15 年前

    检查您的迁移文件以查看是否在那里创建了约束,或者您的项目正在使用一些插件或RubyGem来处理数据库约束。如果这两个区域都出现空白,那么它一定是手动创建的,或者是由外部SQL脚本创建的。

    Rails不生成或使用数据库约束来强制模型关系。数据库引用完整性是您需要添加的内容。

    我看不出有什么理由不能使用以下方法删除此约束:

    mysql> ALTER TABLE academic_records DROP FOREIGN KEY `academic_records_ibfk_1`;
    
        2
  •  0
  •   John Topley    15 年前

    这种事情是不可能通过Rails迁移使用DSL。。。但是,这并不能阻止人们手动创建外键或使用 execute("SQL HERE") 在你的迁徙中。

    由于我不熟悉MySQL的语法,您最好的参考是MySQL文档,尤其是 DROP CONSTRAINT

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