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

Requêtes MySQL Discussion :

Valeur NULL par défaut non prise en compte


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2016
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2016
    Messages : 109
    Par défaut Valeur NULL par défaut non prise en compte
    Bonjour,

    J'ai mis par défaut la valeur NULL sur plusieurs champs, mais lors que je fais un INSERT sans renseigner ces champs, la valeur par défaut ne s'applique pas alors que les valeurs type integer par défaut s'appliquent.

    Comme exemple, la valeur par défaut ne s'applique pas lors d'un INSERT pour les champs Nom2 et NomAnglais.

    Quelqu'un a une idée ?

    Voici la structure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE TABLE IF NOT EXISTS `langues_famille` (
      `Id` int(11) NOT NULL COMMENT 'Identifiant de la famille de langues',
      `Nom` varchar(50) DEFAULT NULL COMMENT 'Nom de la famille de langues',
      `Nom2` varchar(500) DEFAULT NULL COMMENT 'Liste des Nom2',
      `NomAnglais` varchar(50) DEFAULT NULL COMMENT 'Liste des noms anglais de la famille de langue',
      `Type_Id` int(11) NOT NULL DEFAULT '2' COMMENT 'Identifiant du type d''élément',
      `Dossier` varchar(50) CHARACTER SET latin1 COLLATE latin1_general_ci DEFAULT NULL COMMENT 'Répertoire d''enregistrement des ressources pour cet enregistrement',
      `Date_Modification` datetime DEFAULT NULL COMMENT 'Date de modification de l''enregistrement',
      `Autre` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'Enregistrement différent',
      `Date_Creation` datetime DEFAULT NULL COMMENT 'Date de création de l''enregistrement'
    ) ENGINE=InnoDB AUTO_INCREMENT=92 DEFAULT CHARSET=utf8;
    L'INSERT se fait de la façon suivante : (c'est un INSERT factorisé à l'ensemble de mes tables)
    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
    function Element_Ajouter($Table_Nom)
    /*
    But : Ajouter un Element 
    Paramètres : $Table_Nom (Nom de la table de l'élément)
    Résultat : l'Id de l'élément créé
    */
    {
    	$Phrase_SQL = "INSERT INTO ".$Table_Nom." 
    					(`Date_Modification`, `Date_Creation`) 
    					VALUES 
    					('".date('Y-m-d H:i:s')."', '".date('Y-m-d H:i:s')."');";
    	$result = mysql_query($Phrase_SQL) or die (mysql_error());
    	$result = mysql_query("SELECT LAST_INSERT_ID();"); 
    	$last_id = mysql_fetch_array($result);
    	SQL_Enregistre($Phrase_SQL);
    	return $last_id[0];
    }
    Merci d'avance

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 636
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Pourquoi dites vous que la valeur par défaut ne s'applique pas, que trouvez vous après insert dans les colonnes "DEFAULT NULL" ?
    Pourquoi avoir modélisé une table dont l'essentiel des colonnes est nullable et dont la valeur par défaut est NULL ? en particulier la date de création
    Pourquoi récupérez vous le LAST_INSERT_ID() alors qu'aucune colonne de votre table n'est de type AUTO_INCREMENT ?

    Enfin petite précision sémantique, NULL n'est pas vraiment une valeur, mais plus précisément un marqueur

  3. #3
    Membre confirmé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2016
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2016
    Messages : 109
    Par défaut
    En effet, je n'ai pas écrit toute la définition de la table, voici le complément :
    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
    -- Index pour la table `langues_famille`
    --
    ALTER TABLE `langues_famille`
      ADD PRIMARY KEY (`Id`),
      ADD UNIQUE KEY `Dossier` (`Dossier`),
      ADD UNIQUE KEY `Nom` (`Nom`),
      ADD KEY `fk_langues_famille_langues_famille_type_01` (`Type_Id`);
     
    --
    -- AUTO_INCREMENT pour les tables exportées
    --
     
    --
    -- AUTO_INCREMENT pour la table `langues_famille`
    --
    ALTER TABLE `langues_famille`
      MODIFY `Id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Identifiant de la famille de langues',AUTO_INCREMENT=92;
    --
    -- Contraintes pour les tables exportées
    --
     
    --
    -- Contraintes pour la table `langues_famille`
    --
    ALTER TABLE `langues_famille`
      ADD CONSTRAINT `fk_langues_famille_langues_famille_type_01` FOREIGN KEY (`Type_Id`) REFERENCES `langues_famille_type` (`Id`);
    Donc il y a bien un Id créé et récupéré. J'ai fait le choix des NULL pour factoriser au maximum la création d'élément dans mes 22 tables avec une seule fonction et de les sécuriser avec les FOREIGN KEY.

  4. #4
    Membre confirmé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2016
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2016
    Messages : 109
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Bonjour,

    Pourquoi dites vous que la valeur par défaut ne s'applique pas, que trouvez vous après insert dans les colonnes "DEFAULT NULL" ?
    Pourquoi avoir modélisé une table dont l'essentiel des colonnes est nullable et dont la valeur par défaut est NULL ? en particulier la date de création
    Pourquoi récupérez vous le LAST_INSERT_ID() alors qu'aucune colonne de votre table n'est de type AUTO_INCREMENT ?

    Enfin petite précision sémantique, NULL n'est pas vraiment une valeur, mais plus précisément un marqueur
    Pour la sémantique du NULL, je suis preneur d'explications, je me coucherai moins bête ce soir, car dans phpMyAdmin, il est proposé ce "choix" par défaut et j'en ai besoin car comme je mets des contraintes FOREIGN KEY, à la création j'ai besoin d'un NULL puis avec ma fonction de CLASS Enregistrer je précise les valeurs pour chacune de mes 22 tables selon les champs de chaque table.

    Donc je suis tout ouie pour apprendre de nouvelles choses de votre part.

    Merci d'avance

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 636
    Billets dans le blog
    10
    Par défaut
    Le NULL n'est pas une valeur, c'est même tout le contraire, ce marqueur indique l'absence de valeur.
    Le plus souvent, la présence de NULL est symptomatique d'une modélisation hasardeuse, et du non respect des formes normales.

    Vous n'avez pas répondu sur la valeur que vous obtenez dans les colonnes qui sont sensées être nulles, qu'en est-il ?

    Pourquoi souhaitez vous centraliser dans une seule fonction les insertions qui concernent différentes tables ?

  6. #6
    Membre confirmé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2016
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2016
    Messages : 109
    Par défaut
    Bonsoir,

    J'ai tendance à utiliser NULL comme l'absence de valeur assignée à un champ pour faire la différence avec une valeur assignée car la chaîne vide n'est pas forcément une absence de valeur ou du moins me paraît moins explicite.
    Donc dans ma programmation, le NULL est volontaire et géré.

    Mais je suis prêt à apprendre comment mieux programmer.

    L'INSERT renvoie un champ avec une chaîne vide.

    Pour la centralisation, c'est tout simplement parce que j'ai factorisé au maximum les fonctions pour limiter au maximum les validations et limiter les risques de bugs lors des évolutions du programme.

    Merci d'avoir pris le temps de me répondre.

    Citation Envoyé par escartefigue Voir le message
    Le NULL n'est pas une valeur, c'est même tout le contraire, ce marqueur indique l'absence de valeur.
    Le plus souvent, la présence de NULL est symptomatique d'une modélisation hasardeuse, et du non respect des formes normales.

    Vous n'avez pas répondu sur la valeur que vous obtenez dans les colonnes qui sont sensées être nulles, qu'en est-il ?

    Pourquoi souhaitez vous centraliser dans une seule fonction les insertions qui concernent différentes tables ?

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 010
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par berthos Voir le message
    Bonsoir,

    J'ai tendance à utiliser NULL comme l'absence de valeur assignée à un champ pour faire la différence avec une valeur assignée car la chaîne vide n'est pas forcément une absence de valeur ou du moins me paraît moins explicite.
    Donc dans ma programmation, le NULL est volontaire et géré.
    Un des principes fondamentaux de base nde la modélisation des données est :
    • "Pas de NULL"


    Les autres étant :
    • Pas de redondance
    • La modification d'une information ne dois pas entraîner la mise à jour de plus d'une ligne

    Bien entendu ce "pas de null" signifie aussi, pas de valeurs fausses ( chaine vide, zéro, valeur arbitraire comme 31/12/9999...)

    Tout ces problèmes se résolvent par une modélisation correcte utilisant les 4 premières formes normales.

    Mais je suis prêt à apprendre comment mieux programmer.
    Donc, cours de modélisation !


    L'INSERT renvoie un champ avec une chaîne vide.

    Pour la centralisation, c'est tout simplement parce que j'ai factorisé au maximum les fonctions pour limiter au maximum les validations et limiter les risques de bugs lors des évolutions du programme.
    C'est tout le contraire qu'il faut faire ! Dans un univers ensemblistes (BD Relationnelles) les processus itératifs (fonctions) n'ont pas leur place sauf par exeception (quand il n'y a pas moyen de faire autrement).

    Merci d'avoir pris le temps de me répondre.
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. Changement de l'imprimante par défaut non pris en compte
    Par KRis dans le forum Composants VCL
    Réponses: 2
    Dernier message: 20/05/2008, 12h10
  2. getchar et scanf : valeur non prise en compte
    Par Angelina007 dans le forum C
    Réponses: 8
    Dernier message: 25/10/2007, 13h47
  3. non prise en compte d'une formule remplie par une macro
    Par mardona dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 15/06/2007, 15h08
  4. Adresse IP non prise en compte par le système
    Par lesouriciergris dans le forum Windows Serveur
    Réponses: 4
    Dernier message: 08/03/2007, 21h50
  5. [VBA-A] valeur non prise en compte par un composant
    Par robert_trudel dans le forum VBA Access
    Réponses: 4
    Dernier message: 01/07/2006, 22h25

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