À partir du document PostgreSQL
Les contraintes d'exclusion garantissent que si deux lignes sont comparées sur les colonnes ou expressions spécifiées à l'aide des opérateurs spécifiés, au moins une de ces comparaisons d'opérateurs renverra false ou null. La syntaxe est:
CREATE TABLE circles ( c circle, EXCLUDE USING Gist (c WITH &&) );
Je me demandais ce que signifie EXCLUDE USING Gist (c WITH &&)
? En particulier, Gist()
, c WITH &&
Et EXCLUDE USING
.
Peut-il être réécrit en termes de check
? Merci.
Alors qu'une contrainte CHECK
évalue une expression basée sur une seule ligne de la table, une contrainte EXCLUDE
évalue une comparaison de deux lignes de la table. Considérez-le comme une contrainte généralisée UNIQUE
: au lieu de "pas deux lignes peuvent être égales", vous pouvez dire des choses comme "pas deux lignes se chevauchent", ou même "pas deux lignes peuvent être différent ".
Pour y parvenir sans vérifier toutes les combinaisons possibles de valeurs, il a besoin d'une structure d'index appropriée qui lui permette de rechercher d'éventuelles violations lorsque vous insérez ou mettez à jour une ligne. C'est à cela que la partie Gist
de la déclaration fait référence: n type particulier d'index qui peut être utilisé pour accélérer des opérations autres que l'égalité.
Le reste de la déclaration est la contrainte elle-même: c
est la colonne en cours de test, et &&
Est l'opérateur qui ne doit retourner true pour aucune paire de lignes. Dans ce cas, &&
Est l'opérateur "chevauchements" comme indiqué sur la page de manuel des opérateurs géométriques .
Donc, ensemble, la contrainte EXCLUDE USING Gist (c WITH &&)
se traduit par "pas deux valeurs de c
doivent se chevaucher (plus précisément, A.c && B.c
Doit renvoyer false ou null pour toutes les lignes distinctes A
et B
), et veuillez utiliser un index Gist
pour surveiller cette contrainte ".