So implementieren Sie einen eindeutigen Index für zwei Spalten in Schienen

93

Ich habe eine Tabelle und versuche, einen eindeutigen Index für zwei Spalten hinzuzufügen. Diese Spalten werden ebenfalls indiziert. Meine Frage ist also, ob ich nur die Indizes entfernen kann, die nur für eine Spalte waren, oder ob ich alle drei Indizes verwenden muss:

add_index "subscriptions", ["user_id"]
add_index "subscriptions", ["content_id"]
add_index "subscriptions", ["user_id"], ["content_id"], :unique => true
Markus
quelle
5
Als Randnotiz: Wenn Sie MySQL verwenden, ist es nicht sinnvoll, Ihre used_idund content_idin separaten Indizes zu haben, wenn Sie auch einen eindeutigen Index für beide Spalten haben. Dies gilt wahrscheinlich auch für andere DBs ... Entgegen Ihren Erwartungen wirkt sich dies negativ auf die Leistung aus (insbesondere Einfügungen / Aktualisierungen).
Hurikhan77

Antworten:

183
add_index :subscriptions, [:user_id, :content_id], unique: true
Shingara
quelle
6
Es gibt auch alternative Syntaxen: add_index: subscriptions, [: user_id ,: content_id] ,: unique => true add_index: subscriptions,% w (user_id content_id) ,: unique => true Sie sind dasselbe, nur unterschiedliche Syntax zum Angeben der Spalten.
François Beausoleil
14
@ FrançoisBeausoleil %w(user_id content_id)in Ruby erstellt nur eine Reihe von Zeichenfolgen, es ist nichts Besonderes für Schienen. Sie können dasselbe tun, mit "user_id content_id".splitdem noch ein Array von Zeichenfolgen erstellt wird. Ich bin sicher, dass Sie das wissen, dieser Kommentar ist nur, damit andere Leser dies nicht falsch auf Schienen beziehen :)
Khaja Minhajuddin
Wie lautet die Syntax für die Tabellenerstellung? <- Antwort gefunden ( stackoverflow.com/questions/4870961/… )
tnaught
Ich habe ein seltsames Problem, nachdem ich das benutzt habe. Mit rake db: migrate kann keine neue Migration ausgeführt werden. Die Migration kann nur mit der Versionsnummer rake db: migrate: up ausgeführt werden. VERSION = 20180411062714 Datei für Datei. Ich hatte bereits Daten in der Tabelle, für die ich in zwei Spalten eindeutig true ausgeführt habe.
Thedudecodes
@ FrançoisBeausoleil Nun, eigentlich sind sie nicht dasselbe, %w(user_id content_id)ist ein Array von Strings. Welches ist das gleiche wie ['user_id', 'content_id']. Die andere Notation für Array of Symbols ist %i(user_id content_id), oder wie das OP es schrieb[:user_id, :content_id]
Sasa Blagojevic