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 26/10/2007, 14h35   #1
Nouveau Membre du Club
 
Avatar de Shinn77
 
Inscription : juin 2007
Messages : 51
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : juin 2007
Messages : 51
Points : 27
Points : 27
Envoyer un message via ICQ à Shinn77 Envoyer un message via MSN à Shinn77
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 :
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 :
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
Shinn77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2007, 15h08   #2
Rédactrice
 
Avatar de Fleur-Anne.Blain
 
Inscription : juillet 2006
Messages : 2 662
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 2 662
Points : 5 590
Points : 5 590
tu n'as pas de message d'erreur?

sinon essaie
Code :
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.
__________________
la culture c'est comme la confiture moins on en a plus on l'étale.

Vous souhaitez contribuer aux rubriques Solutions d'entreprises ou BI, contactez-moi

Mes tutos
Fleur-Anne.Blain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2007, 15h14   #3
Membre du Club
 
Inscription : janvier 2007
Messages : 66
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 66
Points : 49
Points : 49
Bonjour,
le mot clé DEFAULT devrait convenir à ta situation:

Code :
INSERT INTO matable(nom) VALUES (DEFAULT)
sur le site de mysql : http://dev.mysql.com/doc/refman/5.0/fr/insert.html

Code :
1
2
3
4
INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
    [INTO] tbl_name [(col_name,...)]
    VALUES ({expr | DEFAULT},...),(...),...
    [ ON DUPLICATE KEY UPDATE col_name=expr, ... ]
JinJu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2007, 15h20   #4
Nouveau Membre du Club
 
Avatar de Shinn77
 
Inscription : juin 2007
Messages : 51
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : juin 2007
Messages : 51
Points : 27
Points : 27
Envoyer un message via ICQ à Shinn77 Envoyer un message via MSN à Shinn77
Alors...

Code :
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 :
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 :
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
Shinn77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2007, 15h24   #5
Rédactrice
 
Avatar de Fleur-Anne.Blain
 
Inscription : juillet 2006
Messages : 2 662
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 2 662
Points : 5 590
Points : 5 590
DEFAULT à la place de ta valeur non renseignée ou tu veux mettre la valeur par defaut
__________________
la culture c'est comme la confiture moins on en a plus on l'étale.

Vous souhaitez contribuer aux rubriques Solutions d'entreprises ou BI, contactez-moi

Mes tutos
Fleur-Anne.Blain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2007, 15h31   #6
Nouveau Membre du Club
 
Avatar de Shinn77
 
Inscription : juin 2007
Messages : 51
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : juin 2007
Messages : 51
Points : 27
Points : 27
Envoyer un message via ICQ à Shinn77 Envoyer un message via MSN à Shinn77
Avec DEFAULT ca marche en revanche lors d'un insert ! merci ! :
Code :
INSERT INTO matable (nom) VALUES (DEFAULT);
Par contre dans ma procédures stockées j'ai une erreur de syntaxe...

Code :
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
Shinn77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2007, 15h44   #7
Rédactrice
 
Avatar de Fleur-Anne.Blain
 
Inscription : juillet 2006
Messages : 2 662
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 2 662
Points : 5 590
Points : 5 590
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.
__________________
la culture c'est comme la confiture moins on en a plus on l'étale.

Vous souhaitez contribuer aux rubriques Solutions d'entreprises ou BI, contactez-moi

Mes tutos
Fleur-Anne.Blain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2007, 15h51   #8
Nouveau Membre du Club
 
Avatar de Shinn77
 
Inscription : juin 2007
Messages : 51
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : juin 2007
Messages : 51
Points : 27
Points : 27
Envoyer un message via ICQ à Shinn77 Envoyer un message via MSN à Shinn77
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 :
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
Shinn77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2007, 16h13   #9
Rédactrice
 
Avatar de Fleur-Anne.Blain
 
Inscription : juillet 2006
Messages : 2 662
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 2 662
Points : 5 590
Points : 5 590
Je pense tout simplement que tu dois faire une mauvais utilisation de la fonction COALESCE je ne vois pas autre chose ...
__________________
la culture c'est comme la confiture moins on en a plus on l'étale.

Vous souhaitez contribuer aux rubriques Solutions d'entreprises ou BI, contactez-moi

Mes tutos
Fleur-Anne.Blain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2007, 16h19   #10
Nouveau Membre du Club
 
Avatar de Shinn77
 
Inscription : juin 2007
Messages : 51
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : juin 2007
Messages : 51
Points : 27
Points : 27
Envoyer un message via ICQ à Shinn77 Envoyer un message via MSN à Shinn77
Ah bon...

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

Code :
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 :
Call Proc_spI_AjouterRole ''
Il va m'ajouter une ligne avec comme nom 'test' (logique).
Shinn77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/10/2007, 10h51   #11
Nouveau Membre du Club
 
Avatar de Shinn77
 
Inscription : juin 2007
Messages : 51
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : juin 2007
Messages : 51
Points : 27
Points : 27
Envoyer un message via ICQ à Shinn77 Envoyer un message via MSN à Shinn77
Personne n'a d'idées ??

Merci d'avance,

Shinn77
Shinn77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/10/2007, 12h09   #12
Nouveau Membre du Club
 
Avatar de Shinn77
 
Inscription : juin 2007
Messages : 51
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : juin 2007
Messages : 51
Points : 27
Points : 27
Envoyer un message via ICQ à Shinn77 Envoyer un message via MSN à Shinn77
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 :
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 :
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.


Citation:
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 :
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
Shinn77 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 15h50.


 
 
 
 
Partenaires

Hébergement Web