2017-08-15 12 views
1

私はCustomersテーブルに新しい外部キー列を追加しようとしています。これは私の移行です:外部キー - エラー

class AddCompanyForeignKeyToCustomers < ActiveRecord::Migration[5.1] 
    def change 
    add_reference :customers, :company, foreign_key: true 
    add_foreign_key :customers, :companies 
    end 
end 

はこれらは私が取得していますエラーです:

rake aborted! 
StandardError: An error has occurred, this and all later migrations canceled: 

PG::DuplicateObject: ERROR: constraint "fk_rails_ef51a916ef" for relation "customers" already exists 
: ALTER TABLE "customers" ADD CONSTRAINT "fk_rails_ef51a916ef" 
FOREIGN KEY ("company_id") 
    REFERENCES "companies" ("id") 

ActiveRecord::StatementInvalid: PG::DuplicateObject: ERROR: constraint "fk_rails_ef51a916ef" for relation "customers" already exists 
: ALTER TABLE "customers" ADD CONSTRAINT "fk_rails_ef51a916ef" 
FOREIGN KEY ("company_id") 
    REFERENCES "companies" ("id") 

PG::DuplicateObject: ERROR: constraint "fk_rails_ef51a916ef" for relation "customers" already exists 

ことのいずれかが何を意味するのでしょうか?私はfk_rails_ $ NUMBERが何であるか分からない。

答えて

1

add_referenceadd_foreign_keyを呼び出すことによって外部キーを2回追加しようとしています。ドキュメントはさらに詳しく説明しますが、基本的にadd_foreign_keyはキーとadd_referenceを追加します foreign keyを追加してください(上記のコードではforeign_key:trueを使用しています)。それはあなたが複製する外部キー制約を作成しようとしていることを意味

class AddCompanyForeignKeyToCustomers < ActiveRecord::Migration[5.1] 
    def change 
    add_foreign_key :customers, :companies 
    end 
end 
1

私があなただったら、私はちょうどadd_foreign_keyを使用しますが、それはあなたが何をしようとしてより適していると思われますあなたがすでに持っているもの。

この行はcompaniesを参照customers上の外部キー制約を作成するだけでなく、この行は、ただ、削除、再び

add_foreign_key :customers, :companies 

を外部キー制約をやろうとしているcompany_id

add_reference :customers, :company, foreign_key: true 

を作成しますあなたはまた、company_id列を追加する必要があるかどうかによって、どちらか一方を選択することができます