IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes PostgreSQL Discussion :

Mise en place de DEFERRABLE INITIALLY DEFERRED sur la contrainte d'une table


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    Par défaut Mise en place de DEFERRABLE INITIALLY DEFERRED sur la contrainte d'une table
    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE matable SET idx_position = idx_position+1 ;
    avec le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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!

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 897
    Points : 53 135
    Points
    53 135
    Billets dans le blog
    6
    Par défaut
    Je vais vous répondre un peu plus tard car je dois filer...
    Mais sur tout autre SGBDR normalement constitué, pas besoin de contrainte déferrable... C'est un des défauts majeurs de PG avec le FULL outer join mal supporté !

    Donc, si vous envisagez de tel manipulation, il serait profitable de changer de SGBDR, par exemple en allant sur SQL Server qui vient d'ailleurs d'arriver sur Linux pour les indécrotables du pingouin !!! ;-)

    A +

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 897
    Points : 53 135
    Points
    53 135
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par sat83 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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!
    La defferabilité se pilote contrainte par contrainte et non pas globalement au niveau de la table...

    Votre seconde syntaxe est la bonne, mais la defferabilité ne jouera que sur le contrainte d"unicité

    A +

    Par exemple :

    CONSTRAINT UK UNIQUE DEFERRABLE INITIALLY DEFERRED

  4. #4
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    Par défaut
    Merci pour votre retour!
    Malheureusement je ne peux pas changer de SGBD, je n'est pas pouvoir de décision la dessus!

    Par contre avec les deux requêtes ci-dessous, j'ai une erreur de synthase à l’exécution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    )
    ERREUR: erreur de syntaxe sur ou près de « DEFERRABLE »
    LINE 7: CONSTRAINT uk_index UNIQUE (idx_position) DEFERRABLE INITI...
    . ^
    ********** Erreur **********

    ERREUR: erreur de syntaxe sur ou près de « DEFERRABLE »
    État SQL :42601
    Caractère : 204
    Après plusieurs essais, je ne trouve pas la bonne synthaxe pour cette requête!
    Si quelqu'un pouvait m'aiguiller ce serait top!
    Pour info, je suis sous PostgreSQL 8.4.20 (je précise aussi que je n'ai pas possibilité de changer de version).

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 897
    Points : 53 135
    Points
    53 135
    Billets dans le blog
    6
    Par défaut
    Je ne pense pas que cette version supporte la defférabilité des contraintes... A vérifier !

    Pourquoi ne pouvez vous pas changer de serveur ? Je le comprendrais si des licences devraient être payées... Mais dans le libre je ne voit aucun intérêt à poursuivre avec une version obsolète qui en cas de problème majeur sera difficile à remonter voir impossible sur un serveur récent !


    A +

  6. #6
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    Par défaut
    Je ne peux pas changer de SGBD car je développe une application (parmi des dizaines d'autres que je ne connais/maitrise pas) utilisant cette base de données.
    Je n'ai aucun pouvoir décisionnel à ce niveau là!

    Si il n'y a pas d'autre solution, je vais faire ça coté client plutôt que coté base de données...

    Merci quand même d'avoir pris le temps de me répondre.

Discussions similaires

  1. Réponses: 6
    Dernier message: 25/08/2014, 15h53
  2. Mise en place d'un lecteur mp3 sur Arduino
    Par lassgui dans le forum Arduino
    Réponses: 4
    Dernier message: 31/03/2014, 21h47
  3. Réponses: 1
    Dernier message: 30/03/2010, 22h03
  4. Réponses: 4
    Dernier message: 07/01/2006, 22h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo