Stellen Sie sich vor, Sie haben eine einfache Tabelle:
name | is_active
----------------
A | 0
A | 0
B | 0
C | 1
... | ...
Ich muss eine spezielle eindeutige Einschränkung erstellen, die in der folgenden Situation fehlschlägt: Unterschiedliche is_active
Werte können nicht für denselben name
Wert nebeneinander existieren .
Beispiel für einen zulässigen Zustand:
Hinweis: Ein einfacher mehrspaltiger eindeutiger Index lässt eine solche Kombination nicht zu.
A | 0
A | 0
B | 0
Beispiel für einen zulässigen Zustand:
A | 0
B | 1
Beispiel für einen fehlgeschlagenen Zustand:
A | 0
A | 1
-- should be prevented, because `A 0` exists
-- same name, but different `is_active`
Idealerweise benötige ich eine eindeutige Einschränkung oder einen eindeutigen Teilindex. Auslöser sind für mich problematischer.
Doppelt A,0
erlaubt, aber (A,0) (A,1)
nicht.
quelle
ERROR: data type boolean has no default operator class for access method "gist"
int
undsmallint
.EXCLUDE USING gist (name WITH =, (is_active::int) WITH <>)
wenn es boolesch ist. Und die Frage hat0
und1
, nichttrue
undfalse
so ist es eher unwahrscheinlich, dass ich mit BooleschenDies ist kein Fall, in dem Sie einen eindeutigen Index verwenden können. Sie können den Zustand in einem Trigger testen, z.
Testen Sie es hier.
quelle