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.2 以来,我一直在处理这个问题:
我继续创建迁移
rails g model Example user:references
然后,在运行迁移之前,我打开迁移文件并编辑t.references :user, foreign_key: true为t.references :user, foreign_key: true, type: :integer
然后运行rake db:migrate应该成功运行并为您添加外键。
| 归档时间: |
|
| 查看次数: |
3781 次 |
| 最近记录: |