2009-11-05 3 views
0

Disons que nous avons une table avec cette définition:Comment déclarer une contrainte de superposition de plage dans la base de données PosgreSQL?

range (
    id bigint primary key, 
    colourId int references colour(id), 
    smellId int references smell(id), 
    from bigint, 
    to bigint 
) 

Ce tableau est en fait une vue réduite sur la table énormément grand:

item (
    id bigint primary key, 
    colourId int references colour(id), 
    smellId int references smell(id), 
    CONSTRAINT item_colour_smell_unique UNIQUE (colour, smell, id) 
) 

Je voudrais traduire item_colour_smell_unique contrainte dans le tableau range . Il doit surveiller les chevauchements des plages [from, to] tout en tenant compte des valeurs des colonnes colourId et smellId.

Répondre

1

Notez que toute solution basée sur un trigger est intrinsèquement dangereuse par rapport aux conditions de course, par ex. lorsque deux transactions simultanées insèrent une ligne avec des plages conflictuelles, aucune d'elles ne verra l'autre ligne en conflit, en raison de la propriété ACID "isolation" (seules les données validées peuvent être vues).

Quelques solutions:

  • procédures d'utilisation avec verrouillage explicite de la table pour forcer sérialisation des inserts.
  • Divisez la [de, à] plage en [de, à partir de + 1, ..., à-1, à] et insérez une ligne pour chacun. De cette façon, vous pouvez utiliser un simple INDEX UNIQUE sur le tableau "range".

développeur PostgreSQL Jeff Davis has been writingabout this lately et mettront en œuvre des contraintes de conflit de gamme dans PostgreSQL 8.5

0

Cela ne vous donne pas une réponse complète, mais il semble que vous souhaitiez utiliser un déclencheur.

1

Il n'existe pas de contrainte de "chevauchement" standard. Vous devrez construire votre propre à partir de certains déclencheurs. Cependant, il y a eu une discussion à ce sujet pour 8.5.

Vous trouverez peut-être également utile le module "seg". Voir les manuels - Annexe F. Modules supplémentaires fournis

Questions connexes