Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/10/2007, 09h42   #1
Invité régulier
 
Inscription : mai 2007
Messages : 63
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 63
Points : 7
Points : 7
Par défaut Trigger auto_increment apres chaque insertion

Bonjour à tous,

je voudrais insérer automatiquement une valeur auto_incremente dans une table qui est vide au départ et qui sera déclencheé après insertion d'une valeur dans une autre colonne.

ma tables est :
Code :
1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE CONTROLES(
controle_id INTEGER AUTO_INCREMENT NOT NULL,
reference_id INTEGER NULL,
controleur_nom VARCHAR(20) NULL,
quantite_controlee INTEGER NOT NULL,
date_controle VARCHAR(20) NULL,
observation NVARCHAR(255) NULL,
CONSTRAINT CONTROLES_controle_id_pk PRIMARY KEY (controle_id),
CONSTRAINT CONTROLES_reference_id_fk FOREIGN KEY (reference_id) REFERENCES ARTICLE_REFERENCES (reference_id),
CHECK (reference_id >= 0)
);



mon trigger est :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
DELIMITER $$
 
CREATE OR REPLACE TRIGGER INCR_CONTROLE 
BEFORE INSERT ON CONTROLES  
FOR EACH ROW 
BEGIN 
	SELECT NVL(MAX(reference_id),0)+ 1 
	INTO :NEW.reference_id 
	FROM CONTROLES WHERE controle_id:NEW.controle_id; 
END $$
 
DELIMITER ;
MySQL a répondu:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'TRIGGER INCR_CONTROLE
BEFORE INSERT ON CONTROLES
FOR EACH ROW
BEGIN
SE' at line 1


merci de votre aide
agur29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/10/2007, 11h50   #2
Invité régulier
 
Inscription : mai 2007
Messages : 63
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 63
Points : 7
Points : 7
je débute en mysql ....je sais pas si c'est faisable ???
agur29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/10/2007, 13h12   #3
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
L'auto-incrément sur controle_id ne te suffit pas ???
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/10/2007, 14h03   #4
Invité régulier
 
Inscription : mai 2007
Messages : 63
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 63
Points : 7
Points : 7
justement je cherche à faire le lien avec une autre table (ma table de base) qui a refrence_id comme clé primaire !! je sais pas si tu peux me proposer une modification sur la structure de ma BD je suis preneur !

ma table de est
Code :
1
2
3
4
5
6
7
8
9
CREATE TABLE ARTICLE_REFERENCES(
reference_id INTEGER AUTO_INCREMENT NOT NULL,
reference_nom VARCHAR(20) NULL,
indice VARCHAR(20) NULL,
lot_num VARCHAR(20) NULL,
lot_quantite INTEGER NULL,
fcr VARCHAR(20) NULL,
 
CONSTRAINT ARTICLE_REFERENCES_reference_id_pk PRIMARY KEY (reference_id));
agur29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/10/2007, 14h20   #5
Expert Confirmé
 
Avatar de berceker united
 
Développeur informatique
Inscription : février 2005
Messages : 2 982
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2005
Messages : 2 982
Points : 3 567
Points : 3 567
Je sais pas si ta syntaxe de trigger est bonne.
Par contre je ne saisie pas trop ce que tu souhaites faire. Peux-tu être plus précis.
Au passage je te donne une fonction qui permet de récupérer le dernier id.
LAST_INSERT_ID()
__________________
Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...
berceker united est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/10/2007, 14h34   #6
Invité régulier
 
Inscription : mai 2007
Messages : 63
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 63
Points : 7
Points : 7
Merci pour la réponse, je m’explique donc : j’ai la table mère « ARTICLE_REFERENCES » qui sera renseignée par une autre table « CONTROLES »

ARTICLE_REFERENCES a pour colonnes :

reference_id INTEGER AUTO_INCREMENT
reference_nom VARCHAR(20)
indice VARCHAR(20)
lot_num VARCHAR(20)
lot_quantite INTEGER

CONSTRAINT ARTICLE_REFERENCES_reference_id_pk PRIMARY KEY (reference_id)

CONTROLES a pour colonnes :

controle_id INTEGER AUTO_INCREMENT
reference_id INTEGER
controleur_nom VARCHAR(20)
quantite_controlee INTEGER
date_controle VARCHAR(20)
observation NVARCHAR(255)
CONSTRAINT CONTROLES_controle_id_pk PRIMARY KEY (controle_id)
CONSTRAINT CONTROLES_reference_id_fk FOREIGN KEY (reference_id) REFERENCES ARTICLE_REFERENCES (reference_id)


Mon problème est comment relié les deux tables ? à chaque insertion à la base y aura une ligne supplémentaire dans les 2 tables, c’est pour cela que j’ai pensé à incrémenté le champs reference_id ?
agur29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/10/2007, 15h32   #7
Expert Confirmé
 
Avatar de berceker united
 
Développeur informatique
Inscription : février 2005
Messages : 2 982
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2005
Messages : 2 982
Points : 3 567
Points : 3 567
Ok, je crois comprendre. Si je résume bien.
Si tu créés un enregistrement dans ARTICLE_REFERENCES Il y a automatique un enregistrement dans CONTROLES . Mais pour les liers il te faut passer l'identifiant unique de ARTICLE_REFERENCES.

Ok, dans ce cas là tu n'as pas besoin de Trigger mais une procédure stocké. qui va contenir ceci.
Code :
1
2
3
4
5
6
7
8
9
INSERT INTO ARTICLE_REFERENCES 
  (reference_nom, indic, lot_num,lot_quantite) 
VALUES 
   (p_reference_nom, p_indic, p_lot_num,p_lot_quantite);
 
INSERT INTO CONTROLES 
(reference_id, controleur_nom, date_controle,observation  )
VALUES
(LAST_INSERT_ID, p_controleur_nom, p_date_controle, p_observation);

Toute les valeur de type p_xxxxx ce sont les variables que tu dois faire passer en paramètre de ta procédure stocké. Ainsi en une seul requête tu auras deux enregistrements.
__________________
Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...
berceker united est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/10/2007, 15h47   #8
Invité régulier
 
Inscription : mai 2007
Messages : 63
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 63
Points : 7
Points : 7
et si je mets dans la table CONTROLES le champs reference_id comme clé primaire (auto_increment) de cette même table et par la même occasion elle sera la clé étrangère de la table ARTICLE_REFERENCES ? et j'enlève du coup le champ controle_id ? qu'est ce que vous pensez ?
agur29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/10/2007, 16h00   #9
Expert Confirmé
 
Avatar de berceker united
 
Développeur informatique
Inscription : février 2005
Messages : 2 982
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2005
Messages : 2 982
Points : 3 567
Points : 3 567
Citation:
Envoyé par agur29 Voir le message
et si je mets dans la table CONTROLES le champs reference_id comme clé primaire (auto_increment) de cette même table et par la même occasion elle sera la clé étrangère de la table ARTICLE_REFERENCES ? et j'enlève du coup le champ controle_id ? qu'est ce que vous pensez ?
Oui, mais pas en auto incrément parce qu'il suffit qu'il y a un os pour que les id ne soit pas synchro ! Je pense que tu devrais quand même passer le dernier ID de la table ARTICLE_REFERENCE. C'est plus propre et moin dangeureux.
__________________
Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...
berceker united est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/10/2007, 16h21   #10
Invité régulier
 
Inscription : mai 2007
Messages : 63
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 63
Points : 7
Points : 7
je vois pas comment utiliser la procédure stockée j'ai jamais créer une ?? vous pouvez pas me donner le début ?

merci bcp
agur29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/10/2007, 16h47   #11
Expert Confirmé
 
Avatar de berceker united
 
Développeur informatique
Inscription : février 2005
Messages : 2 982
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2005
Messages : 2 982
Points : 3 567
Points : 3 567
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE PROCEDURE `maprocedure`(IN monparametre1TEXT, IN monparametre2 CHAR(1))
    DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY INVOKER
    COMMENT ''
BEGIN
INSERT INTO ARTICLE_REFERENCES 
  (reference_nom, indic, lot_num,lot_quantite) 
VALUES 
   (p_reference_nom, p_indic, p_lot_num,p_lot_quantite);
 
INSERT INTO CONTROLES 
(reference_id, controleur_nom, date_controle,observation  )
VALUES
(LAST_INSERT_ID, p_controleur_nom, p_date_controle, p_observation);
END;
En gros c'est comme ça. PAr contre je n'ai pas mis les parametre des deux requêtes d'insert. Tu regardes par rapprort au deux en haut monparametre1 et monparametre2
__________________
Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...
berceker united est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h18.


 
 
 
 
Partenaires

Hébergement Web