2017-02-23 98 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