2016-12-22 40 views
0

我已經創建了一個包含以下內容的遷移文件.. 它適用於SQLite,但是當我切換到MySQL時,我得到一個「無法創建表「錯誤(見下文)。兩個外鍵在MySQL上自動創建「可以創建表」AUTO_INCREMENT PRIMARY KEY

class CreateVisits < ActiveRecord::Migration[5.0] 
    def change 
    create_table :visits, :primary_key => :id do |t| 
     t.references :user, foreign_key: true 
     t.references :visitor, foreign_key: "User" 
     t.timestamps 
    end 
    add_index :visits, [:user_id, :visitor_id], unique: true 
    end 
end 

的MySQL拋出一個錯誤:

Mysql2::Error: Can't create table 'myapp_development.visits' (errno: 150): 
CREATE TABLE `visits` (
`id` int AUTO_INCREMENT PRIMARY KEY, 
`user_id` int, 
`visitor_id` int, 
`created_at` datetime NOT NULL, 
`updated_at` datetime NOT NULL, 
INDEX `index_visits_on_user_id` (`user_id`), 
INDEX `index_visits_on_visitor_id` (`visitor_id`), 
CONSTRAINT `fk_rails_09e5e7c20b` 
FOREIGN KEY (`user_id`) 
    REFERENCES `users` (`id`), 
CONSTRAINT `fk_rails_b156c396f4` 
FOREIGN KEY (`visitor_id`) 
    REFERENCES `visitors` (`id`) 
) 

ENGINE=InnoDB 

想法表示歡迎!

+0

做到這一點,你有'users'表和'visitors'表格製作這個'visits'表之前產生的? –

+0

用戶表已創建之前。訪問表包含2列:user_id和visitor_id,這兩列與用戶表中的1條記錄相關。 –

+0

「visitor」表如何?這看起來像MySQL試圖創建引用,但無法找到它試圖引用 –

回答

1

當您嘗試引用不存在的表時,通常會引發150錯誤。

就你而言,你正在將兩個外鍵引用到users表中的同一主鍵。

但在這種情況下,您不能只使用foreign_key: true。但是你可以通過添加兩行

def change 
    create_table :visits, :primary_key => :id do |t| 
    t.references :user, references: :visits 
    t.references :visitor, references: :visits 
    t.timestamps 
    end 

    add_foreign_key :visits, :users, column: :user_id 
    add_foreign_key :visits, :users, column: :visitor_id 
end