Bonjour à tous,
J'avais déjà posé une question approchante, et vu que le problème semblait venir de postgreSQL, j’étais partis sur une autre solution coté client.
Je suis aujourd'hui confronté à un problème similaire, mais ou la solution coté client est trop lourde.
Je vais expliquer ici a l'aide d'un exemple simplifié au maximum pour illustrer :
J'ai une table :
1 2 3 4 5 6 7 8
| CREATE TABLE matable
(
id_pk serial NOT NULL,
/* plein d'autres champs */
idx_position INTEGER NOT NULL,
CONSTRAINT pk_key PRIMARY KEY (id_pk) ,
CONSTRAINT uk_index UNIQUE (idx_position)
) DEFERRABLE INITIALLY DEFERRED |
Une simple requête UPDATE de décalage de la colonne idx_position plante:
UPDATE matable SET idx_position = idx_position+1 ;
avec le message
ERREUR: la valeur d'une clé dupliquée rompt la contrainte unique « uk_index »
J'ai bien compris que cela était dû au fait que PostgreSQL effectue les requête ligne par ligne, et que la contrainte était rompue en cours de route.
Une solution de contournement semble être d'utiliser DEFERRABLE INITIALLY DEFERRED sur ma table pour forcer la vérification de la contrainte UNIQUE à la fin de la requête.
Par contre, je n'arrive pas à mettre en place cette solution sur ma table, probablement à cause d'un problème de synthase.
J'ai essayé plusieurs solution sans succès, entre autre :
1 2 3 4 5 6 7 8
| CREATE TABLE matable
(
id_pk serial NOT NULL,
/* plein d'autres champs */
idx_position INTEGER NOT NULL,
CONSTRAINT pk_key PRIMARY KEY (id_pk) ,
CONSTRAINT uk_index UNIQUE (idx_position)
) DEFERRABLE INITIALLY DEFERRED -- sur la table |
ou
1 2 3 4 5 6 7 8
| CREATE TABLE matable
(
id_pk serial NOT NULL,
/* plein d'autres champs */
idx_position INTEGER NOT NULL,
CONSTRAINT pk_key PRIMARY KEY (id_pk) ,
CONSTRAINT uk_index UNIQUE (idx_position) DEFERRABLE INITIALLY DEFERRED -- sur la contrainte
) |
Pourriez vous m'indiquer la synthase exacte pour la création de ma table avec DEFERRABLE INITIALLY DEFERRED
Merci par avance!
Partager