J'ai une table 'users' avec deux colonnes, 'email' et 'new_email'. J'ai besoin:Inclure plusieurs colonnes dans un seul index dans Postgres
Une contrainte d'unicité insensible à la casse qui couvre les deux colonnes - à savoir, si « [email protected] » apparaît dans la colonne « e-mail » d'une ligne, insérer « [email protected] » dans un autre La colonne 'new_email' de la ligne (ou même celle de la même ligne) devrait échouer.
Recherche rapide dans la casse d'une adresse e-mail donnée dans les champs 'email' ou 'nouveau_email' - c'est-à-dire que vous trouvez la ligne où le nouvel email OR est "[email protected]", insensible à la casse.
Je sais que je pourrais le faire plus facilement en créant une table reliée « e-mails », mais je prévois être à la recherche des utilisateurs dans ce tableau (par clé primaire) de plusieurs applications, et je J'aime éviter de dupliquer la logique de jointure à différents endroits pour récupérer également leurs emails. Je pense donc qu'un index d'expression serait préférable, si c'est possible. Si ce n'est pas possible, je suppose que ma meilleure option serait de créer une vue que les autres applications pourraient utiliser pour récupérer facilement les emails d'un utilisateur avec leurs autres informations, mais je ne sais pas comment faire ça non plus. J'utilise Postgres 8.4. Je vous remercie!
Deux minuscules fonctions 'UNIQUE INDEX' avec un contrôle de table est votre meilleur choix. Il n'est pas nécessaire d'invoquer un déclencheur pour résoudre ce problème. Utilisez une dérivation de ce que @Scott suggère ci-dessous. – Sean
@Sean: La solution de Scott est sympa mais la COALESCE laisse un trou. –
D'accord, je n'utiliserais pas COALESCE ou deux colonnes pour stocker les valeurs anciennes et actuelles dans une seule table. – Sean