web-dev-qa-db-fra.com

Que signifie la contrainte d'exclusion "EXCLUDE USING Gist (c WITH &&)"?

À 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.

14
user3284469

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 ".

18
IMSoP