PostgreSQL
La base de données la plus sophistiquée au monde.

Ouverture de session

Navigation

Contactez-nous

Administration du site :
"equipe chez postgresqlfr point org"

Contact presse :
"fr chez postgresql point org"

Contact association :
"bureau chez postgresqlfr point org"

Questions PostgreSQL :
 IRC :
  serveur irc.freenode.net
  canal #postgresqlfr

Recherche

Accéder aux archives

« Octobre 2008  
Lun Mar Mer Jeu Ven Sam Dim
  2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31  

Syndication

Flux XML

Sondage

Quelle est la version de PostgreSQL la plus répandue sur vos serveurs ?
8.3
10%
8.2
42%
8.1
40%
8.0
2%
7.4
6%
7.3 ou antérieure
0%
Nombre de votes: 48

Insertion d'un élément dans une liste à une position donnée - Intégrité Référentielle - Contrainte Unique différée

Technique - général | Insertion d'un élément dans une liste à une position donnée - Intégrité Référentielle - Contrainte Unique différée

Par olibrius le 13/01/2006 - 13:10

Bonjour,

Je vous décrie un peu la structure de ma table et le problème que j'ai:

CREATE TABLE categorie
(
id_categorie serial NOT NULL,
id_categorie_pere int4,
id_ordre int4 NOT NULL,
designation varchar NOT NULL,
commentaire text,
CONSTRAINT categorie_pkey PRIMARY KEY (id_categorie),
CONSTRAINT fk_odj_pere FOREIGN KEY (id_categorie) REFERENCES categorie (id_categorie) ON UPDATE RESTRICT ON DELETE RESTRICT,
CONSTRAINT un_categorie_pere_ordre UNIQUE (id_categorie, id_ordre)
)

Comme vous pouvez le voir il existe une relation de un à plusieurs de la table sur elle-même pour une relation par fils.
Je souhaite pouvoir insérer une catégorie fille dans la liste à une position donnée.
Pour cela il me faut incrémenter tous les numeros d'ordre pour les enregistrements ayant 'id_categorie_pere' égal à l'id_categorie du pere et id_ordre supérieure ou égale à la position oû je souhaite insérer la nouvelle catégorie.

La requête SQL pourait prendre la forme suivant:

Update categorie set id_ordre=id_ordre+1 where id_categorie_pere=1 and id_ordre>=3

pour une insertion à la troisieme position.

Après quoi il ne me reste plus qu'a introduire la nouvelle catégorie à la postion 3 dans la même transaction avec la commande

insert into categorie (id_categorie_pere,designation,id_ordre) values (1,'Insertion en position 3',3);

mais quand je fais cela je me trouve confronter à l'impossibilité de modifier id_ordre du fait de la contrainte d'unicité dont je ne sais pas différer l'évaluation jusqu'après le traitement de la requête.

Est-ce que quelqu'un à une idée?
Pour quelle version de postgresql l'évaluation différée des contraintes unique est-elle prevue?

Je tourne actuellement avec une 8.0.0 RC2 ce qui n'est sans doute pas le bon choix.
Merci de vos reponses nombreuses

Olibrius

Options d'affichage des commentaires

Sélectionnez la méthode d'affichage des commentaires que vous préférez, puis cliquez sur "Sauvegarder les paramètres" pour activer vos changements.

dans la version 8.x il est po

sparky/ = 13 Janvier, 2006 - 18:06

dans la version 8.x il est possible de spécifier que la contrainte doit être vérifie avec le commit donc ...

-> http://www.postgresql.org/docs/8.1/interactive/sql-set-constraints.html


© PostgreSQLFr, tous droits réservés.
Site déclaré à la CNIL sous le numéro 1074678, conformément à la Loi en vigueur.