È possibile in PostgreSQL creare un vincolo univoco deferrabile su una colonna di caratteri, ma senza distinzione tra maiuscole e minuscole?Vincolo unico non sensibile alla distinzione tra maiuscole e minuscole
Supponiamo la seguente tabella di base:
CREATE TABLE sample_table (
my_column VARCHAR(100)
);
Se senza vincolo differibile, è semplice come creare indice univoco con funzione, ad esempio:
CREATE UNIQUE INDEX my_unique_index ON sample_table(UPPER(my_column));
differite controllo vincolo richiede la creazione il vincolo in modo esplicito, ad esempio:
ALTER TABLE sample_table
ADD CONSTRAINT my_unique_constraint UNIQUE(my_column)
DEFERRABLE INITIALLY IMMEDIATE;
E unfortunatel y non è possibile utilizzare funzioni arbitrarie nel vincolo univoco.
Una soluzione possibile sarebbe creare una colonna aggiuntiva con lo stesso contenuto di my_column
, ma in maiuscolo, aggiornata tramite un trigger dopo ogni aggiornamento/inserimento, quindi creare un vincolo unico deferrabile su questa colonna artificiale. Questo, tuttavia, sembra un brutto scherzo.
In alternativa, dovrebbe essere possibile utilizzare CREATE CONSTRAINT TRIGGER
e verificare manualmente l'univocità insensibile alle maiuscole/minuscole (ovviamente sarebbe comunque necessario un indice regolare). Questo suona un po 'complicato per un requisito così semplice (e popolare, suppongo).
C'è qualche modo più semplice e/o più elegante attorno a questa limitazione?
vostri Postgres? –
Al momento è 9.1. Eppure, se c'è una bella soluzione disponibile sulle versioni più recenti, sarei perfettamente felice di leggerlo :) –
Controlla i vincoli di 'EXCLUDE'. Possono essere impostati, per agire come maiuscole/minuscole "UNIQUE". –