Ist es in PostgreSQL möglich, eine aufschiebbare eindeutige Einschränkung für eine Zeichenspalte zu erstellen, aber ohne Berücksichtigung der Groß- und Kleinschreibung?Verschiebbare, case-insensitive unique constraint
Lassen Sie uns die folgende einfache Tabelle übernehmen:
CREATE TABLE sample_table (
my_column VARCHAR(100)
);
Wenn aufschiebbare Einschränkung nicht erforderlich ist, ist es so einfach wie mit der Funktion eindeutigen Index erstellen, zB:
CREATE UNIQUE INDEX my_unique_index ON sample_table(UPPER(my_column));
Latente Bedingungsprüfung erfordert die Schaffung die Bedingung explizit, zB:
ALTER TABLE sample_table
ADD CONSTRAINT my_unique_constraint UNIQUE(my_column)
DEFERRABLE INITIALLY IMMEDIATE;
Und leider y Es ist nicht möglich, beliebige Funktionen in der eindeutigen Einschränkung zu verwenden.
Eine mögliche Problemumgehung wäre, zusätzliche Spalte mit dem gleichen Inhalt wie my_column
zu erstellen, aber in Großbuchstaben, nach jedem Update/Einfügung über einen Trigger aktualisiert, und dann eine aufschiebbare eindeutige Einschränkung für diese künstliche Spalte erstellen. Dies klingt jedoch nach einem wirklich hässlichen Hack.
Alternativ sollte es möglich sein, CREATE CONSTRAINT TRIGGER
zu verwenden und manuell auf Groß-/Kleinschreibung zu überprüfen (natürlich wäre ein regulärer Index immer noch notwendig). Dies klingt ein wenig zu kompliziert für solch eine einfache (und beliebte, nehme ich an) Anforderung.
Gibt es einen einfacheren und/oder eleganteren Weg um diese Einschränkung?
Ihre Postgres Version? –
Es ist 9.1 im Moment. Aber wenn es eine nette Lösung für neuere Versionen gibt, würde ich mich freuen, darüber zu lesen :) –
Überprüfen Sie die 'EXCLUDE' Einschränkungen. Sie können so eingerichtet werden, dass sie wie die Groß-/Kleinschreibung "EINMALIG" wirkt. –