Précédent   Forum du club des développeurs et IT Pro > Bases de données > PostgreSQL > Requêtes
Requêtes Forum d'entraide sur les requêtes SQL spécifiques à PostgreSQL, les triggers, les vues, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 30/12/2012, 16h34   #1
Slash__
Invité de passage
 
Homme Stephane
Étudiant
Inscription : décembre 2012
Messages : 5
Détails du profil
Informations personnelles :
Nom : Homme Stephane

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : décembre 2012
Messages : 5
Points : 2
Points : 2
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 :
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 :
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.
Slash__ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/12/2012, 12h13   #2
punkoff
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 2 154
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 2 154
Points : 3 486
Points : 3 486
bonjour,

Essayez cette approche :
Code :
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,
Citation:
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.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/12/2012, 15h50   #3
Slash__
Invité de passage
 
Homme Stephane
Étudiant
Inscription : décembre 2012
Messages : 5
Détails du profil
Informations personnelles :
Nom : Homme Stephane

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : décembre 2012
Messages : 5
Points : 2
Points : 2
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 :
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 .
Slash__ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/12/2012, 17h19   #4
estofilo
Modérateur
 
Inscription : octobre 2008
Messages : 1 702
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 702
Points : 2 347
Points : 2 347
Il existe une manière encore plus directe de l'écrire, sans aucune variable à déclarer:
Code :
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;
...
]
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 03h54.


 
 
 
 
Partenaires

Hébergement Web