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 :

Trigger qui n'aime pas les doublons


Sujet :

Requêtes PostgreSQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    UTC
    Inscrit en
    Décembre 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : UTC
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Trigger qui n'aime pas les doublons
    Bonjour a tous,

    Merci à tous ceux qui liront ce post et qui proposeront une solution.

    Je voudrais créer un trigger que j’exécuterais avant l'insertion dans ma table, pour vérifier si un nom n'est pas déjà présent et si c'est le cas il rajoute un "(*)" à la chaine de caractère avant de procéder à l'insertion de celle-ci.

    Voici la table en question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    -- Table: objet
     
    -- DROP TABLE objet;
     
    CREATE TABLE objet
    (
      id serial NOT NULL,
      nom character varying(10) NOT NULL,
      CONSTRAINT objet_pkey PRIMARY KEY (nom),
      CONSTRAINT objet_id_key UNIQUE (id)
    )
    WITH (
      OIDS=FALSE
    );
    ALTER TABLE objet
      OWNER TO postgres;
    J'avais une petite idée mais cela ne fonctionne pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    CREATE OR REPLACE FUNCTION verifierInsertionObjet()
      RETURNS trigger AS
    $BODY$
    BEGIN
     
    	DECLARE existe INTEGER;
    	-- On verifie si le nom de l'objet existe deja dans la table objet
    	SELECT EXISTS( SELECT * FROM objet where nom = NEW.nom )
    		INTO existe;
     
    	-- On traite le nom si il y a deja existance dans la table
    	IF existe THEN
    		NEW.nom = NEW.nom+"(*)";
    	END IF;
    	RETURN NEW;
    END;
    $BODY$
      LANGUAGE plpgsql VOLATILE
      COST 100;
    ALTER FUNCTION decrementernbobjet()
      OWNER TO postgres;
    le select Exists le renvoie une erreur sous postgresql :/

    Merci beaucoup pour votre aide.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,

    Essayez cette approche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT count(*) INTO existe
    FROM MA_TABLE
    WHERE MA_COL  = $ma_var;
     
    	IF existe > 0 THEN
    		NEW.nom = NEW.nom+"(*)";
    	END IF;


    Sinon,
    e select Exists le renvoie une erreur sous postgresql :/
    Oui car vous l'utilisez mal.
    La clause exists permet de faire un test d’existence entre 2 tables.
    En réalisant une jointure de type "semi" (semi-loop par exemple).
    Ceci permet d'optimiser les temps de recherche lors d'une association n..n, la requête va s’arrêter de scanner la table / index cible à la première occurrence trouvée.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    UTC
    Inscrit en
    Décembre 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : UTC
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Merci beaucoup, je me suis aider de tes indications et après quelque recherche ( notamment sur la concaténation de chaine de caractères ) ça donne cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    CREATE OR REPLACE FUNCTION verifierInsertionObjet()
     RETURNS trigger AS
    $BODY$
     
        DECLARE existe integer;
        DECLARE add text = '(*)';
     
    BEGIN
     
      -- On selectionne une hypothétique ligne éxistante avec ce nom d'objet
      SELECT count(*) INTO existe FROM objet WHERE nom = NEW.nom ;
     
      -- Si cette ligne existe alors on change le nom
      IF existe > 0 THEN
               NEW.nom = CONCAT(NEW.nom,add);
      END IF;
     
    RETURN NEW;
     
    END;

    et cela fonctionne, je met le code au cas ou quelqu'un en aurais besoin.

    Merci pour votre aide .

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Il existe une manière encore plus directe de l'écrire, sans aucune variable à déclarer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE etc...
    BEGIN
     IF EXISTS (SELECT 1 FROM objet WHERE nom = NEW.nom) THEN
       NEW.nom = CONCAT(NEW.nom, '(*)')
     END IF;
     RETURN NEW;
    END;
    ...
    ]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2003] champ calculé qui n'aime pas les multiplications
    Par Peanut dans le forum Excel
    Réponses: 2
    Dernier message: 26/11/2010, 12h29
  2. [Requete] qui n'affiche pas les doublons mais sur un seul champs
    Par joseph.breham dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 19/12/2006, 14h57
  3. probleme avec requete sql aime pas les strings
    Par lil_jam63 dans le forum Bases de données
    Réponses: 3
    Dernier message: 24/02/2004, 14h45

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