2017-02-23 101 views
4

我的MySQL数据库中有一个用户表。在我的轨道4应用程序,我创建了一个权限模型如下:运行rails迁移时无法添加外键约束错误

rails g model Permission user:references privilege:references 

当我运行迁移用于创建权限表,该表不会获取在数据库中创建,但我得到了以下错误:

== 20170223171936 CreatePermissions: migrating ================================ 
-- create_table(:permissions) 
rake aborted! 
StandardError: An error has occurred: 

Mysql2::Error: Cannot add foreign key constraint: ALTER TABLE `permissions` ADD CONSTRAINT `fk_rails_d9cfa3c257` 
FOREIGN KEY (`user_id`) 
    REFERENCES `users` (`id`) 

由于users表已经存在,所以我很疑惑为什么外键创建在权限表中失败。这里可能是什么问题?

回答

5

我解决了这个问题。生成的权限表中的users_id列类型为int(11),users表中的id列的列类型为int(11)unsigned。 TLDR:外键列的数据类型和引用列的数据类型应该相同。

您可以通过运行show full columns from <table_name>来查看列类型。您还可以通过运行show engine innodb status来查看添加外键失败的确切原因。

我创建了一个迁移,以便为用户表从id中删除无符号属性,而现在列类型已对齐,外键加法工作!

0

我经常遇到这个问题,因为外键所指向的列上没有索引。

-1

设置foreign_key假 - > t.references:用户,foreign_key:假

重置数据库 - >轨分贝:迁移:复位,

折戟foreign_key为真 - - > t.references:用户,foreign_key:真

然后迁移DB - >轨分贝:迁移

0

使用此

rails g model Permission user:integer:index privilege:integer:index