Potrzebuję migracji, aby zastosować unikalne ograniczenie do kombinacji kolumn. czyli na people
stole, kombinacji first_name
, last_Name
i Dob
powinien być unikalny.
ruby-on-rails
database
rangalo
źródło
źródło
Według howmanyofme.com w samych Stanach Zjednoczonych 46.427 osób nazywa się John Smith. To około 127 lat dni. Ponieważ jest to znacznie więcej niż średnia długość życia człowieka, oznacza to, że zderzenie DOB jest matematycznie pewne.
Mówię tylko, że ta szczególna kombinacja unikalnych pól może w przyszłości doprowadzić do skrajnej frustracji użytkownika / klienta.
W razie potrzeby weź pod uwagę coś, co jest rzeczywiście unikalne, na przykład krajowy numer identyfikacyjny.
(Zdaję sobie sprawę, że jestem bardzo spóźniony na przyjęcie z tym, ale może to pomóc przyszłym czytelnikom.)
źródło
Możesz chcieć dodać ograniczenie bez indeksu. Zależy to od używanej bazy danych. Poniżej znajduje się przykładowy kod migracji dla Postgres.
(tracking_number, carrier)
to lista kolumn, których chcesz użyć dla ograniczenia.Możesz dodać różne ograniczenia. Przeczytaj dokumentację
źródło
add_index
metody. ;)pg_constraint
tabeli.Cześć Możesz na przykład dodać unikalny indeks w migracji do kolumn
lub oddzielne unikalne indeksy dla każdej kolumny
źródło
W typowym przykładzie tabeli łączenia między użytkownikami i postami:
Próba utworzenia dwóch podobnych rekordów spowoduje błąd bazy danych (w moim przypadku Postgres):
np. robiąc to:
W pełni działający przykład: https://gist.github.com/Dorian/9d641ca78dad8eb64736173614d97ced
db/schema.rb
wygenerowane: https://gist.github.com/Dorian/a8449287fa62b88463f48da986c1744aźródło
Ze względu na kompletność i dla uniknięcia nieporozumień, są trzy sposoby zrobienia tego samego:
Dodanie nazwanego, unikalnego ograniczenia do kombinacji kolumn w Railsach 5.2+
Załóżmy, że mamy tabelę Lokalizacje, która należy do reklamodawcy i zawiera kolumnę kod_referencyjny, a Ty chcesz mieć tylko jeden kod referencyjny na reklamodawcę. więc chcesz dodać unikatowe ograniczenie do kombinacji kolumn i nazwać je.
Robić:
rails g migration AddUniquenessConstraintToLocations
I spraw, aby Twoja migracja wyglądała jak ta jedna linijka:
LUB ta wersja bloku.
LUB ta surowa wersja SQL
Każde z nich będzie miało ten sam wynik, sprawdź
schema.rb
źródło