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 :

[MySQL5] Champs Default, lors d'un INSERT


Sujet :

SQL Procédural MySQL

  1. #1
    Nouveau membre du Club Avatar de Shinn77
    Inscrit en
    Juin 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Juin 2007
    Messages : 51
    Points : 36
    Points
    36
    Par défaut [MySQL5] Champs Default, lors d'un INSERT
    Bonjour,

    Dans le cadre d'une application non professionnel, j'ai créé des tables avec des valeurs par défaut.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CREATE TABLE matable (id int primary key auto_increment, nom varchar(20) default 'Non renseigné');
    Comment obtenir la valeur par défaut ?

    Si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    INSERT INTO matable(nom) VALUES ('');
     
    // ou
     
    INSERT INTO matable(nom) VALUES (null);
    Après un Select * FROM matable;
    je peux voir que la valeur "non renseigné" n'a pas été prise en compte. Comment dois je procéder ?

    Merci,

    Shinn77, Till the End of Time

  2. #2
    Rédactrice

    Avatar de Fleur-Anne.Blain
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 637
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 637
    Points : 6 805
    Points
    6 805
    Par défaut
    tu n'as pas de message d'erreur?

    sinon essaie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE TABLE matable (id int PRIMARY KEY AUTO_INCREMENT, nom varchar(20) NOT NULL DEFAULT 'Non renseigné');
    ou bien ajoute ta valeur par defaut dans un alter table mais normalement ca passe avec le CREATE du dessus.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2007
    Messages : 66
    Points : 59
    Points
    59
    Par défaut
    Bonjour,
    le mot clé DEFAULT devrait convenir à ta situation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO matable(nom) VALUES (DEFAULT)
    sur le site de mysql : http://dev.mysql.com/doc/refman/5.0/fr/insert.html

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
        [INTO] tbl_name [(col_name,...)]
        VALUES ({expr | DEFAULT},...),(...),...
        [ ON DUPLICATE KEY UPDATE col_name=expr, ... ]

  4. #4
    Nouveau membre du Club Avatar de Shinn77
    Inscrit en
    Juin 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Juin 2007
    Messages : 51
    Points : 36
    Points
    36
    Par défaut
    Alors...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CREATE TABLE matable (id int PRIMARY KEY AUTO_INCREMENT, nom varchar(20) NOT NULL DEFAULT 'Non renseigné');
    Insertion :
    INSERT INTO matable VALUES ('', ''); => me retourne une nouvelle ligne avec nom vide
    INSERT INTO matable(nom) VALUES (''); => me retourne une nouvelle ligne avec nom vide
    INSERT INTO matable(nom) VALUES (null); => me retourne une erreur
    INSERT INTO matable() VALUES (); => me retourne une nouvelle ligne avec la valeur par défaut...

    Seulement c'est pas ce que je recherche... en effet mon but est que, dans une procédure stockée, faire un insert dans une table. Celle ci à des champs avec des valeurs par défaut si on les renseigne pas

    la requete serait du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    INSERT INTO matable(champs1, champs2, champs3, champs4...)
    VALUES (param1, param2, param3, param4...);
    Si admettons que le champs3 a une valeur par défaut et que le params a été renseigner de la sorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CALL Proc_spI_AjouterMatable ('param1', 'param2', '', 'param4'...);
    Dans ma table j'aurai pas la valeur par défaut de param3 mais "vide" => ''
    Ce qui me convient pas étant donné que j'ai mis les valeurs par défaut pour simplifier justement le traitement.

    je pourrais biensur tester mon champs mes paramètres dans ma procédure stockée via des IF et lancer des requêtes différentes si tel ou tel params avec des valeurs par défaut a été renseigné ou non. Mais si j'ai 20 champs, dont 8 en valeur par défaut non obligatoire, j vais avoir un paquer immense de IF et ca serait assez moche...

    Bref pour le moment ca marche pas

    Merci de votre aide et de ton aide.

    Shinn77

  5. #5
    Rédactrice

    Avatar de Fleur-Anne.Blain
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 637
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 637
    Points : 6 805
    Points
    6 805
    Par défaut
    DEFAULT à la place de ta valeur non renseignée ou tu veux mettre la valeur par defaut

  6. #6
    Nouveau membre du Club Avatar de Shinn77
    Inscrit en
    Juin 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Juin 2007
    Messages : 51
    Points : 36
    Points
    36
    Par défaut
    Avec DEFAULT ca marche en revanche lors d'un insert ! merci ! :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO matable (nom) VALUES (DEFAULT);
    Par contre dans ma procédures stockées j'ai une erreur de syntaxe...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    DELIMITER $$
     
    DROP PROCEDURE IF EXISTS `web75-shinn77`.`Proc_spI_AjouterRole` $$
    CREATE DEFINER=`web75-shinn77`@`%` PROCEDURE `Proc_spI_AjouterRole`(
      p_Nom  varchar(80)
    )
    BEGIN
      INSERT INTO Role(Nom)
      VALUES ( COALESCE(  NULLIF(  LOWER(p_Nom), ''),  DEFAULT) );
    END $$
     
    DELIMITER ;
    En tout cas merci j'ai appris quelque chose aujourd'hui

  7. #7
    Rédactrice

    Avatar de Fleur-Anne.Blain
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 637
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 637
    Points : 6 805
    Points
    6 805
    Par défaut
    La valeur par default n'est pas insérée à la création, il y a zero ligne c'est normal, cette valeur est utilisé uniquement si tu appelles la valeur par defaut dans un update ou insert.

  8. #8
    Nouveau membre du Club Avatar de Shinn77
    Inscrit en
    Juin 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Juin 2007
    Messages : 51
    Points : 36
    Points
    36
    Par défaut
    Euh ok mais c'est le cas là non ?
    Regarde ma procédure stockée lance un INSERT.

    Celui ci, en fonction de p_Nom vérifie si le champs est vide, si celui ci est vide, il le met en Null (NULLIF), ensuite via COALESCE, il vérifie si le contenu renvoyé par NULLIF est null, si c'est le cas, il renvoit DEFAULT sinon, il renvoit la valeur donné par p_Nom.

    En gros :
    Si p_Nom = '' Alors p_Nom = null (NULLIF)
    Si p_Nom = null Alors DEFAULT sinon p_Nom

    Donc si mon param p_Nom a été renseigné à vide (Call Proc_spI_AjouterRole ''), alors la requete exécuté par la procédure stockée sera :
    INSERT INTO Role (Nom) VALUES (DEFAULT);

    Voilà.

    Cependant, il n'accepte pas la valeur DEFAULT dans le COALESCE. Enfin je ne sais pas comment m'y prendre pour qu'il l'accepte.

    Mon but est le suivant :
    Si le paramètre a été renseigné, on insert le Role portant le nom qui a été renseigné.
    Sinon, on insert une nouvelle ligne avec comme nom le nom par défaut de la colonne de la 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
    Call Proc_spI_AjouterRole ('Role1'); 
     
    SELECT * FROM Role;
     
    => id      Role
    => 1       Role1
     
    Call Proc_spI_AjouterRole (''); 
     
    SELECT * FROM Role;
     
    => id      Role
    => 1       Role1
    => 2       Role Par Defaut
    Merci

  9. #9
    Rédactrice

    Avatar de Fleur-Anne.Blain
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 637
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 637
    Points : 6 805
    Points
    6 805
    Par défaut
    Je pense tout simplement que tu dois faire une mauvais utilisation de la fonction COALESCE je ne vois pas autre chose ...

  10. #10
    Nouveau membre du Club Avatar de Shinn77
    Inscrit en
    Juin 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Juin 2007
    Messages : 51
    Points : 36
    Points
    36
    Par défaut
    Ah bon...

    Pourtant si je remplace DEFAULT par une valeur style 'test' ca marche...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    DELIMITER $$
     
    DROP PROCEDURE IF EXISTS `web75-shinn77`.`Proc_spI_AjouterRole` $$
    CREATE DEFINER=`web75-shinn77`@`%` PROCEDURE `Proc_spI_AjouterRole`(
      p_Nom  varchar(80)
    )
    BEGIN
      INSERT INTO Role(Nom)
      VALUES ( COALESCE(  NULLIF(  LOWER(p_Nom), ''),  'test') );
    END $$
     
    DELIMITER ;
    Quand je dis que ça marche, c'est pas que ça met la valeur par défaut, c'est juste que je peux lancer la requete...

    Si je l'appelle comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call Proc_spI_AjouterRole ''
    Il va m'ajouter une ligne avec comme nom 'test' (logique).

  11. #11
    Nouveau membre du Club Avatar de Shinn77
    Inscrit en
    Juin 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Juin 2007
    Messages : 51
    Points : 36
    Points
    36
    Par défaut
    Personne n'a d'idées ??

    Merci d'avance,

    Shinn77

  12. #12
    Nouveau membre du Club Avatar de Shinn77
    Inscrit en
    Juin 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Juin 2007
    Messages : 51
    Points : 36
    Points
    36
    Par défaut
    Okay, j'ai finalement trouvé !!

    Fonction Default()

    S'il est vrai qu'avec Default cela ne marchait pas dans le COALESCE à l'intérieur d'une procédure, avec Default(column name) ça marche !!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    DELIMITER $$
     
    DROP PROCEDURE IF EXISTS `web75-shinn77`.`Proc_spI_AjouterRole` $$
    CREATE DEFINER=`web75-shinn77`@`%` PROCEDURE `Proc_spI_AjouterRole`(
      p_Nom  varchar(80)
    )
    BEGIN
      INSERT INTO Role(Nom)
      VALUES ( COALESCE(  NULLIF(  LOWER(p_Nom), ''),  DEFAULT(Nom)) );
    END $$
     
    DELIMITER ;
    Ainsi si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call Proc_spI_AjouterRole('');
    Ca m'ajoute bien une ligne avec comme Nom, ma valeur par défaut !

    Merci à tous !

    Je met le post en Résolu.


    Edit : NULL ou NOT NULL ?

    PS : Dans la table champs peut être à Null ou Not Null, tant que la valeur Default a été renseigné la procédure marchera. De manière générale, si on utilise pas la procédure et passe par un simple INSERT, si la colonne n'est pas cité :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO Role(Description) Values ('titotot');
    Le champs Nom qui a une valeur par defaut peut donc être NULL comme l'exemple ci dessus ou je ne l'appelle pas.

    Donc, personnellement, je met le champs à NULL avec une valeur par défaut. Après à vous de voir, mais je trouve cela plus logique.

    Shinn77, Till the End of Time

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 02/07/2009, 23h38
  2. [H2]Champ auto_increment lors d'un insert
    Par getz85 dans le forum Autres SGBD
    Réponses: 1
    Dernier message: 03/10/2008, 14h41
  3. [MySQL] Gestion d'un champ auto_increment lors d'une insertion
    Par b_e_n_n dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 01/06/2008, 21h33
  4. interversion de champ lors d'1 insert
    Par fred0306 dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 30/11/2006, 11h22
  5. Champs ignorés lors d'insertion par SQL Loader
    Par Bewitch dans le forum SQL*Loader
    Réponses: 3
    Dernier message: 13/09/2006, 12h19

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