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

SQL Procédural MySQL Discussion :

[TRIGGER] insertion avec clef auto-increment dupliquer


Sujet :

SQL Procédural MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 612
    Par défaut [TRIGGER] insertion avec clef auto-increment dupliquer
    Bonjour,

    Je possede une base de donnèes pour gerer utilisateur, boite de messagerie, message. Je crèè quelque trigger pour automatiser un peut la gestion:

    - sur creation d'un utilisateur, creation de boite de messagerie standard
    - sur suppression d'un utilisateur, suppression de ses boite de messagerie
    - sur suppression des boite de messagerie, suppression de leur message

    lors de la creation du 2ème(ou plus) utilisateur les boite de messagerie ne peuvent etre generer car la clef '0' est dupliquer.
    la 1ere chose auquel on pense est "on assigne tout le temp 0 en clef primaire de boite de messagerie" mais non....(ou sinon je ne comprend plus se que je tape)

    Creation de Table
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    DROP DATABASE IF EXISTS `mediamanager`;
    CREATE DATABASE `mediamanager`;
    USE `mediamanager`;
     
    CREATE TABLE user(
    	id_user VARCHAR(45) NOT NULL,
    	userName VARCHAR(45) NOT NULL,
    	password VARCHAR(45) NOT NULL,
    	email VARCHAR(45) NOT NULL,
    	question VARCHAR(45) NOT NULL,
    	reponse VARCHAR(45) NOT NULL,
    	PRIMARY KEY (`id_user`)
    ) ENGINE=InnoDB;
     
    CREATE TABLE boite_message(
    	id_boite_message INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
    	id_user VARCHAR(45) NOT NULL,
    	nom VARCHAR(45) NOT NULL,
    	obligatoire BOOLEAN NOT NULL,
    	PRIMARY KEY(`id_boite_message`)
    ) ENGINE=InnoDB;
     
    CREATE TABLE message(
    	id_message INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
    	id_expediteur VARCHAR(45) NOT NULL,
    	id_boite_message INTEGER UNSIGNED NOT NULL,
    	titre VARCHAR(45) NOT NULL,
    	corp TEXT NOT NULL,
    	date DATETIME,
    	lu BOOLEAN NOT NULL,
    	PRIMARY KEY(`id_message`)
    ) ENGINE=InnoDB;
     
    CREATE VIEW liste_message AS
    	SELECT b.id_user AS 'id_user', b.id_boite_message, u1.userName AS 'expediteur', m.id_message, titre, corp, DATE_FORMAT(date,GET_FORMAT(DATE,'EUR')) AS 'date', lu
    	FROM user u1, user u2, boite_message b, message m
    	WHERE m.id_expediteur = u1.id_user AND u2.id_user = b.id_user AND b.id_boite_message = m.id_boite_message;
    Creation des Triggers et Insertion d'un utilisateur:
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    USE `mediamanager`;
     
    DELIMITER |
     
    /* CREATION UTILISATEUR => CREATION BOITE DE MESSAGERIE STANDARD */
    CREATE TRIGGER BoiteMessageStandard
     AFTER INSERT ON user
     FOR EACH ROW BEGIN
    	INSERT INTO boite_message (id_user, nom, obligatoire) VALUES(NEW.id_user, 'Reception', '1');
    	INSERT INTO boite_message (id_user, nom, obligatoire) VALUES(NEW.id_user, 'Emission', '1');
    	INSERT INTO boite_message (id_user, nom, obligatoire) VALUES(NEW.id_user, 'Corbeille', '1');
     END;
    |
     
    /* SUPPRESSION UTILISATEUR => SUPPRESSION BOITE MESSAGERIE */
    CREATE TRIGGER PurgeBoiteMessage
     AFTER DELETE ON user
     FOR EACH ROW BEGIN
        DELETE FROM boite_message WHERE id_user = DELETED.id_user;
     END;
    |
     
    /* SUPPRESSION BOITE MESSAGE => SUPPRESSION MESSAGE */
    CREATE TRIGGER PurgeMessage
     AFTER DELETE ON boite_message
     FOR EACH ROW BEGIN
    	DELETE FROM message WHERE id_boite_message = DELETED.id_boite_message;
     END;
    |
     
    DELIMITER ;
     
    INSERT INTO user VALUES('1', 'Admin', 'admin', 'mail@mail.com', 'Quel est le nom de l''administrateur?', 'TRUC');
    merci pour votre aide

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Février 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2009
    Messages : 129
    Par défaut
    Mais au final, quelle est ta question ?

    Stéphane

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 612
    Par défaut


    enfait d'après moi je ne definis en aucune maniere la clef primaire dans mon trigger mais uniquement les valeur non indexè. alors quel erreur ai je fait pour qu'il me dise "tu ne peut pas inseret une ligne avec la clef primaire '0' car elle existe deja"

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Février 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2009
    Messages : 129
    Par défaut
    Si tu fais ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO user VALUES('1', 'Admin', 'admin', ...);
    INSERT INTO user VALUES('2', 'XXX', 'xxx', ...);
    ça fonctionne très bien donc a priori pas d'erreur dans ton trigger.

    Par contre, si tu fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO user VALUES('1', 'Admin', 'admin', ...);
    INSERT INTO user VALUES('1', 'XXX', 'xxx', ...);
    alors ça ne fonctionne plus...mais c'est normal et ça ne vient pas de ton trigger.
    C'est simplement que tu as une primary key et que tu essaies d'insérer plusieurs lignes avec une même valeur de primary key !

    Si tu définissais plutôt le champ id_user de ta table user comme un INT auto_increment, tu n'as plus besoin de t'occuper de peupler ce champ et tu n'auras plus de problème. Et en bonus, InnoDB sera encore plus content avec une primary key en INT.

    Stéphane

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 612
    Par défaut
    euh je suis pas sur que l'on se soit compris....

    ma table User n'as aucun problème d'ajout mais lorsque je fait un ajout dans User cela doit ajouter 3 enregistrement dans BoiteMessagerie et se sont ces 3 insertion qui ne fonctionne pas

    il reagit comme si j'avais defini la clef primaire de mes 3 nouvelle BoiteDeMessagerie alors que ce n'est pas le cas, j'ai fait des test, le conflit de clef primaire interviens dans la table "BoiteMessagerie"

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Février 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2009
    Messages : 129
    Par défaut
    Euh, en effet, on ne doit pas se comprendre ...

    Après avoir défini la table et les triggers comme tu l'as fait dans ton 1er post, je fais les manips suivantes :

    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
    22
    23
    24
    25
    26
    27
    28
    29
     
    mysql> INSERT INTO user VALUES('1', 'Admin', 'admin', 'mail@mail.com', 'Quel est le nom de l''administrateur?', 'TRUC');
    Query OK, 1 row affected (0.03 sec)
     
    mysql> SELECT * FROM boite_message;
    +------------------+---------+-----------+-------------+
    | id_boite_message | id_user | nom       | obligatoire |
    +------------------+---------+-----------+-------------+
    |                1 | 1       | Reception |           1 | 
    |                2 | 1       | Emission  |           1 | 
    |                3 | 1       | Corbeille |           1 | 
    +------------------+---------+-----------+-------------+
    3 rows in set (0.00 sec)
     
    mysql> INSERT INTO user VALUES('2', 'Admin2', 'admin2', 'mail2@mail.com', 'Quel est le nom de l''administrateur?2', 'TRUC2');
    Query OK, 1 row affected (0.01 sec)
     
    mysql> SELECT * FROM boite_message;
    +------------------+---------+-----------+-------------+
    | id_boite_message | id_user | nom       | obligatoire |
    +------------------+---------+-----------+-------------+
    |                1 | 1       | Reception |           1 | 
    |                2 | 1       | Emission  |           1 | 
    |                3 | 1       | Corbeille |           1 | 
    |                4 | 2       | Reception |           1 | 
    |                5 | 2       | Emission  |           1 | 
    |                6 | 2       | Corbeille |           1 | 
    +------------------+---------+-----------+-------------+
    6 rows in set (0.00 sec)
    Tout fonctionne donc bien comme prévu.
    Peux-tu m'indiquer des requêtes qui te provoquent une erreur ?

    Stéphane

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

Discussions similaires

  1. [MySQL] Insertion impossible avec id auto-increment
    Par yamino dans le forum Bases de données
    Réponses: 2
    Dernier message: 06/09/2011, 12h21
  2. [DERBY] Insert avec un auto-increment sur la table
    Par cashmoney dans le forum JDBC
    Réponses: 3
    Dernier message: 15/09/2009, 15h11
  3. [SQL Server] INSERT avec clef sur n° auto
    Par Monstros Velu dans le forum Langage SQL
    Réponses: 9
    Dernier message: 31/03/2006, 17h54
  4. [JDBC] Insertion dans Access auto Increment
    Par sg-40 dans le forum JDBC
    Réponses: 4
    Dernier message: 09/11/2005, 22h14
  5. [Jdbc] insertion avec numero auto
    Par ice69 dans le forum JDBC
    Réponses: 2
    Dernier message: 31/10/2005, 19h19

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