Jak zaimplementować unikalny indeks na dwóch kolumnach w szynach

97

Mam tabelę i próbuję dodać unikalny indeks do dwóch kolumn. Te kolumny również są indeksowane. Więc moje pytanie brzmi, czy mogę po prostu usunąć indeksy, które były tylko dla jednej kolumny, czy muszę użyć wszystkich trzech indeksów:

add_index "subscriptions", ["user_id"]
add_index "subscriptions", ["content_id"]
add_index "subscriptions", ["user_id"], ["content_id"], :unique => true
Markus
źródło
5
Na marginesie: jeśli korzystasz z MySQL, nie ma sensu mieć własnego used_idi content_idoddzielnych indeksów, jeśli masz również unikalny indeks obu kolumn. Prawdopodobnie dotyczy to również innych baz danych ... W przeciwieństwie do tego, czego się spodziewasz, będzie to miało negatywny wpływ na wydajność (zwłaszcza wstawienia / aktualizacje).
hurikhan77

Odpowiedzi:

191
add_index :subscriptions, [:user_id, :content_id], unique: true
shingara
źródło
6
Istnieją również alternatywne składnie: add_index: subscriptions, [: user_id,: content_id],: unique => true add_index: subscriptions,% w (user_id content_id),: unique => true To to samo, tylko inna składnia do określania kolumn.
François Beausoleil
14
@ FrançoisBeausoleil %w(user_id content_id)w ruby ​​tworzy po prostu tablicę łańcuchów, nie jest to szczególne dla railsów. Możesz zrobić to samo, "user_id content_id".splitco nadal tworzy tablicę ciągów. Jestem pewien, że to wiesz, ten komentarz jest tylko po to, aby inni czytelnicy nie odnosili tego nieprawidłowo do szyn :)
Khaja Minhajuddin
Jaka byłaby składnia tego przy tworzeniu tabeli? <- znaleziona odpowiedź ( stackoverflow.com/questions/4870961/… )
tnaught
Mam dziwny problem po użyciu tego. Nie można uruchomić żadnej nowej migracji przy użyciu rake db: migrate. Migrację można przeprowadzić tylko przy użyciu numeru wersji rake db: migrate: up VERSION = 20180411062714 po jednym pliku na raz. Miałem już dane w tabeli, na której zrobiłem unikalną wartość true w dwóch kolumnach.
thedudecodes
1
@ FrançoisBeausoleil Cóż, w rzeczywistości to nie to samo, %w(user_id content_id)to tablica ciągów. Który jest taki sam jak ['user_id', 'content_id']. Inną notacją dla tablicy symboli jest %i(user_id content_id), lub jak to napisał OP[:user_id, :content_id]
Sasa Blagojevic,