运行rails迁移时无法添加外键约束错误

Raz*_*aza 9 mysql activerecord ruby-on-rails ruby-on-rails-4

我的MySQL数据库中有一个用户表.在我的rails 4应用程序中,我创建了一个Permission模型,如下所示:

rails g model Permission user:references privilege:references
Run Code Online (Sandbox Code Playgroud)

当我运行迁移以创建权限表时,表确实在数据库中创建,但是我收到以下错误:

== 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`)
Run Code Online (Sandbox Code Playgroud)

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

Raz*_*aza 13

我修好了.users_id生成的权限表中的列类型为int(11),idusers表中列的列类型为int(11)unsigned.TLDR:外键列的数据类型和引用列的数据类型应该相同.

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

我创建了一个迁移,以从idusers表中删除unsigned属性,现在列类型已对齐,外键添加工作!

  • 在 Rails 5.1 中遇到了类似的问题,其中主键现在是 BigInts。我添加了一个带有 `add_column(:projects, :price_list_id, :integer, null: false)` 的外键,当我尝试添加外键时,迁移失败了。我需要`add_column(:projects, :price_list_id, :bigint, null: false)` 作为外键,以便它们匹配。 (3认同)

tod*_*eny 9

自从我们升级到 Rails 5.2 以来,我一直在处理这个问题:

我继续创建迁移 rails g model Example user:references

然后,在运行迁移之前,我打开迁移文件并编辑t.references :user, foreign_key: truet.references :user, foreign_key: true, type: :integer

然后运行rake db:migrate应该成功运行并为您添加外键。