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 :

Empêcher l'insertion des données avec un trigger


Sujet :

SQL Procédural MySQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 8
    Par défaut Empêcher l'insertion des données avec un trigger
    Bonjour à tous,

    je suis entrain de créé un trigger pour ma table messagearticle sous mysql qui à pour rôle d'empêcher l'insertion des lignes qui sont existent dans la table
    pourrez vous m'aidez pour résoudre ce problème .

    Merci


    c'est le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    delimiter //
    CREATE TRIGGER datasources.test BEFORE INSERT ON `datasources`.`messagearticle` 
    FOR EACH ROW 
    BEGIN 
    DECLARE titre varchar(200); 
     
    set titre= (select TITRE from datasources.messgearticle where NOM_AUTEUR =New.NOM_AUTEUR and TITRE =New.TITRE and date= New.DATE ) ; 
    IF(titre is not null) 
    THEN 
     
    END IF; 
    END; // 
    delimiter ;

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 287
    Par défaut
    C'est inutilement compliqué. Pour empêcher de saisir des lignes déjà présente, on définit des clés uniques.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 8
    Par défaut
    merci pour votre réponse mais ça ce que j'ai pensé à faire en première lieu j'ai essayer de modifier le clé primaire ma table messagearticle mais mysql m'affiche des exceptions de type erreur to rename il m a pas accepter les modidificatons

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 287
    Par défaut
    Tu peux créer des clefs uniques indépendamment de la clé primaire (CREATE UNIQUE INDEX...).

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 45
    Par défaut
    bonjours,
    vos réponse ne réponde pas a la questions initial, et cette question m'interesse... le moteur de recherche m'amenant a cette non reponse

    juste pour les gus qui recherche ce genre de chose (moi en tête), pourriez vous apporté le bout de code manquant a l'exemple 1er...
    pour ma part, c'est pour compenser l'absence de foreignkey sous MyISAM

    en gros a l'insert (before) je verifie si les clé étrangère existe dans leur table source, sinon je n'entre pas la ligne (complete), la requette ci dessous est bonne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    mysql> SELECT COUNT( pays_id ) 
        -> FROM  `pays` 
        -> WHERE  `pays`.`pays_id` =  'FR'
        -> LIMIT 1;
    +------------------+
    | COUNT( pays_id ) |
    +------------------+
    |                1 |
    +------------------+
    1 row in set (0.00 sec)
    reste a empecher l'insertion si (pays.pays_id = NEW.pays_id) = 0
    ou laisser s'enregistrer si = 1

    mais la je n'arrive a rien, mysql jamais content de la syntax, celle de la doc ne fonctionne pas, des exemples non plus, et je suis obliger de le faire sous myISAM .... please, un bout de code qui marche sur MySQL 5.1

  6. #6
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 287
    Par défaut
    Pour l'utilisation de triggers afin de valider les données, je vous invite à lire l'article de kazou : http://alain-defrance.developpez.com...integre-error/.

    Je pense que cette lecture vous convaincra que l'utilisation d'un trigger dans ce cas est plus tordue que ce qu'on pourrait penser. C'est pourquoi il est préférable de s'appuyer, dès que c'est possible, sur des mécanismes plus simples. Pour le cas soulevé par hazmza, la clé unique s'impose.

    Dans votre cas, je pense qu'un INSERT... SELECT conviendrait. Par exemple, si je suppose que vous voulez insérer le couple ('FR', 'hello France !') dans une table, à condition que 'FR' existe dans la table pays, cela donnerait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO une_table (pays_id, blabla)
    SELECT pays_id, 'hello France !'
    FROM pays
    WHERE pays_id = 'FR'
    (je suppose ici que pays_id est la clé primaire de pays)

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 45
    Par défaut
    j'ai testé, si c'est faut, on viol la contrainte d'unicité ou de foreignkey MAIS SUR INNODB (et beaucoup est promi dans les prochaine version)
    moi je suis bloqué sur MyISAM et point de foreignkey, et pas d'unicité puisque ce sont les ville d'un pays (1 pays d'une ville le Vatican ?)
    en gros
    ville(ville_id,#pays_id,ville_nom)
    pays(pays_id,pays_nom)

    mais avec myisam, la clé externe, y s'en tappe. et je voudrai que la bdd puisse un minimum ce dfendre si sujete a un insert venu d'un bidouillage non souhaité 'source externe'
    il est sur que mes requette a moi seront propres...

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 45
    Par défaut
    bon,
    c'est pas terrible mais ca marche...
    je vide la nouvelle valeur et je le laisse ce cassé les dents sur 'NOT NULL', ca myISAM y sait faire
    il faudra encore traité l'erreur (caché la misère quoi)
    pour l'exemple
    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
     
    -- 5.1.41 --
    CREATE TABLE `P` (
      `p_id` varchar(4) NOT NULL,
      `p_nom` varchar(10) NOT NULL,
      PRIMARY KEY (`p_id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
    CREATE TABLE `V` (
      `v_id` tinyint(2) NOT NULL AUTO_INCREMENT,
      `v_pid` varchar(4) NOT NULL,
      PRIMARY KEY (`v_id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
     
    INSERT INTO P values ('FR', 'France')
    INSERT INTO P values ('BE', 'Belgique')
    et le trigger
    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
     
    DELIMITER //
    DROP TRIGGER IF EXISTS fk_V_Pid 
     //
    CREATE TRIGGER fk_V_Pid BEFORE INSERT ON V FOR EACH ROW
    BEGIN
    	DECLARE cpt TINYINT(1);
    	SELECT COUNT(p_id) INTO cpt FROM P 
    	WHERE P.p_id = NEW.v_pid
    	LIMIT 1;
    	IF (cpt < 1) THEN 
    		SET NEW.v_pid = NULL;
    		SET NEW.v_id = NULL;
    	END IF;
    END //
    DELIMITER ;
    -- test KO --
    mysql> INSERT INTO V VALUES ('', 'FRA');
    ERROR 1048 (23000): Column 'v_pid' cannot be null
    mysql> 
    -- test OK --
    mysql> INSERT INTO V values ('', 'FR')
    Query OK, 1 row affected, 1 warning (0.00 sec)
    pas besoin de critique sauf pour amélioration, c'est un peut bidouille mais c'est toujours mieux que tous laisser rentrer.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 8
    Par défaut
    salut les gars j'ai résoudre le problème j'ai créé une procédure Mysql et j'ai l'utiliser depuis ma classe java et ça ma résoudre totalement le problème bref j'ai trouvé un logiciel d'une interface graphique sympa pour mysql il permet à vous de créé des procédure il suffit juste d'ecrire la requête SQL .

    c est le lien de téléchargement de logiciel :
    http://www.sqlmanager.net/fr/products/mysql/manager


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

Discussions similaires

  1. Réponses: 10
    Dernier message: 01/08/2014, 18h20
  2. Oracle et insertion des données avec accents
    Par Lolitaaa dans le forum Oracle
    Réponses: 17
    Dernier message: 07/04/2009, 15h14
  3. [MySQL] Insertion des données avec les caractères spéciaux
    Par rachou59650 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 02/05/2008, 11h16
  4. Supprimer des données avec un trigger
    Par engi dans le forum SQL
    Réponses: 3
    Dernier message: 09/04/2008, 15h25
  5. [C#] problème avec l'insertion des données dans MySQL
    Par madica dans le forum Accès aux données
    Réponses: 7
    Dernier message: 08/11/2005, 13h27

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