2014-11-29 10 views
7

Rails 4.2 nowo obsługuje dodawanie i usuwanie kluczy obcych (migracje), takich jak:Rails 4.2 klucz obcy

# add a foreign key to `articles.author_id` referencing `authors.id` 
add_foreign_key :articles, :authors 

Co ja nie rozumiem: Jak to

add_foreign_key :articles, :authors 

różni się od to:

add_column :articles, :author_id, :integer 

Dziękujemy za wyjaśnienia!

Odpowiedz

9

Różnica polega na tym, że linia:

add_foreign_key :articles, :authors 

faktycznie generuje to:

ALTER TABLE "articles" ADD CONSTRAINT articles_author_id_fk FOREIGN KEY ("author_id") REFERENCES "authors" ("id"); 

Chociaż:

add_column :articles, :author_id, :integer 

wygeneruje:

ALTER TABLE "articles" ADD COLUMN author_id INT(11); 

Obie są różne, ponieważ add_foreign_key doda tylko ograniczenie foreign key, a add_column dodaje kolumnę, a nie ograniczenie.

+0

Dzięki. Czy słuszne jest stwierdzenie, że użycie '' 'add_foreign_key''' spowoduje lepszą wydajność bazy danych (ponieważ dodaje klucz obcy)? – TomDogg

+1

technicznie, * zmniejsza * 'wydajność bazy danych', ponieważ zmusza DB do sprawdzenia tego ograniczenia dla każdej aktualizacji/wstawienia. Dodaje jednak "integralność referencyjną", tj. Zapewnia, że ​​twoje dane "mają sens", i nie dostajesz niespójnych/osieroconych danych – mmcrae