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

MySQL Discussion :

Problème de NULL dans un CREATE/SELECT


Sujet :

MySQL

  1. #1
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 128
    Points : 12 185
    Points
    12 185
    Billets dans le blog
    5
    Par défaut Problème de NULL dans un CREATE/SELECT
    Bonjour,

    Dans la phase de migration de MySQL 4.0.17-nt vers MySQL: 5.0.45, je rencontre un problème de NULL sur quelques champs qui ne devraient pas l'être de part le fait que je souhaite que dans ma table, tous les champs soient NULL autorisés.
    Le script étant un CREATE/SELECT, je rencontre une erreur au niveau des UPDATE et INSERT qui suivent cette séquence.
    Or, il s'avère qu'avec la version précédente de MySQL, la 4.x donc, nous n'avions aucun problème mais, du fait de la nouvelle version, le comportement n'est pas celui attendu. J'ai pris quelques infos ça et là en modifiant notamment le fichier my.ini à ce niveau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
    et en le mettant en Remarque mais sans succès.

    Est-ce que, en dehors de créer préalablement ma table comme il se doit, il existerait une solution pour que mon CREATE/SELECT se conforme strictement à la mise en place de champ NULL dans la V5 ?
    Note:
    Les NULL définis à NON dans ma table créée sont majoritairement des numériques de type decimal(18,1) par exemple. Dans ma source, le champ peut potetiellement être à NULL et non à 0

    Merci pour vos suggestions.

    Argy

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 739
    Points
    11 739
    Par défaut
    Tes tables sont-elles en InnoDB ou en MyISAM (ou autre ?)

    Quel est ton SQL mode ? (select @@sql_mode)

  3. #3
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 128
    Points : 12 185
    Points
    12 185
    Billets dans le blog
    5
    Par défaut
    Salut Antoun,

    En InnoDB.
    Quel est ton SQL mode ? Là, je ne sais pas, je ne peux te répondre que lundi car là, ze suis @home.
    En fait mon problème c'est que le projet créée plus de 200 tables à la volée dans différentes bases les unes liées de près ou de loin avec les autres.
    Je ne peux pas, techniquement parlant, créer les tables d'abord avec les champs prédéfinis, je suis contraint de procéder en CREATE/SELECT...

    Il me semblait qu'il fallait configurer un truc quelque part dans le my.ini par exemple mais je n'en ai plus souvenir.

    Merci à toi,

    Argy

  4. #4
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 739
    Points
    11 739
    Par défaut
    Dans le my.ini, enlève le STRICT_TRANS_TABLES dans la définition du sql-mode, redémarres ton serveur, et reteste.

  5. #5
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 128
    Points : 12 185
    Points
    12 185
    Billets dans le blog
    5
    Par défaut
    Bonsoir,

    Ooops !!!
    Citation Envoyé par Antoun
    Quel est ton SQL mode ?
    J'avais pas capté
    Je l'avais spécifié dans mon premier post
    ...
    Veux tu dire que cette ligne déjà en REM dans mon fichier INI :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
    doit être, selon ce que tu me préconises, spécifiée comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
    Bref, avec ou sans, ça ne change rien :
    _______________________________________
    Erreur
    requête SQL:

    UPDATE myTable SET myTable.myField...
    MySQL a répondu:

    #1048 - Column 'myField' cannot be null
    ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

    Mon @@SQL_MODE = ''...

    Argy

  6. #6
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 739
    Points
    11 739
    Par défaut
    Bon, je pensais qu'en inhibant le STRICT MODE, tes NULL seraient automatiquement remplacés par des valeurs par défaut, mais apparemment ça ne fonctionne pas...

    Une astuce serait d'ajouter une ligne de NULL à tes CREATE SELECT. Par exemple, cette requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    create table argy 
    select fam_id, fam_lib, fam_pere 
    from famille
    doit donc devenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    create table argy 
    select fam_id, fam_lib, fam_pere 
    from famille 
    union all 
    select null, null, null

  7. #7
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 128
    Points : 12 185
    Points
    12 185
    Billets dans le blog
    5
    Par défaut
    Ok, j'essayerais ça mardi en 17, là je suis plus sur ce dossier...

    Merci
    ++

    Argy

  8. #8
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 128
    Points : 12 185
    Points
    12 185
    Billets dans le blog
    5
    Par défaut
    Antoun,

    Excuse pour mon silence mais je suis sur plusieurs projets en même temps.
    Donc je reviens à la charge et je ne peux pas mettre en application ce que tu m'as proposé car j'ai trop de scripts à modifier, non pas que je sois feignant mais plutôt septique :

    Sur un serveur de Recette, ce CREATE/SELECT fonctionne parfaitement.
    Sur celui de PROD, ça plante à cause des champs qui se voient attribuer la valeur NON à l'attribut Null. Ce phénomène se produit uniquement lorsque les champs de la clause SELECT ont des valeurs forcées, soit par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE TABLE TEST SELECT Champ1, Champ2, 0 AS Champ3, SPACE(2) AS Champ4, Champ5 
    FROM TableSource 
    WHERE Champ1 > 10;
    Dans cette condition, en RECETTE :
    Les champs 3 et 4 n'auront pas l'attribut Null à NON mais à OUI, ce qui m'arrange et résoudra mes problèmes;
    En PROD, ils seront à NON.

    Recette : Version du client MySQL: 5.0.45 | Version du serveur: 5.0.45-community-nt

    Prod : Version du client MySQL: 5.0.45 | Version du serveur: 5.1.28-rc-community

    Par ailleurs, j'ai comparé les variables d'environnement et je n'ai rien trouvé qui laisse supposer que ce comportement doit être ainsi.

    Comment puis-je paramétrer le serveur de PROD pour qu'il se comporte comme celui de recette ? Dois-je installer la version précédente (la même donc que celui de recette) ?

    Merci

    Argy

  9. #9
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 739
    Points
    11 739
    Par défaut
    Je ne sais pas trop quoi te dire. Le comportement de la version 5.1 me semble logique, puisque sur les colonnes avec des constantes, il n'y a effectivement jamais de NULL.

    Il y a peut-être une variable ou un SQL_MODE qui dicte ce comportement, mais je ne l'ai pas trouvé.

    Dans ton cas, je suppose qu'effectivement la solution la plus simple serait de downgrader ton serveur de prod...

  10. #10
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 128
    Points : 12 185
    Points
    12 185
    Billets dans le blog
    5
    Par défaut
    Antoun,

    J'ai trouvé la solution... Enfin et ça m'évite bien des galères :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE TBLTest(
    Champ3 TINYINT NULL, 
    Champ4 VARCHAR(3) NULL,
    Champ5 DATETIME NULL) 
    SELECT Champ1, Champ2, 1 AS Champ3, space(3) AS Champ4, 
    '0000-00-00 00:00:00' AS Champ5
    FROM TBLSource
    Merci de ton intervention

    Argy

  11. #11
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 739
    Points
    11 739
    Par défaut
    Je croyais que tu ne pouvais pas faire ça parce que ton projet créait "plus de 200 tables à la volée" ?

  12. #12
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 128
    Points : 12 185
    Points
    12 185
    Billets dans le blog
    5
    Par défaut
    Oui et non...
    Ce que tu me proposais m'obligeait à faire des modifs majeures telle que c'était présenté
    En fait, la génération des tables s'effectue à partir d'un tableau Excel où lignes et colonnes sont sollicité dans des boucles jusqu'à fin de tableau et où la description des chaque script est séquentiellement décrit.
    Je n'ai eu donc que des modifs mineures à mettre en place dans le processus de génération des script SQL finaux...

    Au lieu dans chaque cellule des termes comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    000000.0000    Champ1
    0000-00-00     Champ2
    Space(3)       Champ3
    Champ4         Champ4
    J'ai modifié ces dernière avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    NULL;DECIMAL(10, 4)    Champ1
    NULL;DATE              Champ2
    NULL;VARCHAR(3)        Champ3
    Champ4                 Champ4
    Le tableau de string me décrit le champ à créer avec sont attribut souhaité directement en 3 lignes de code dasn mon programme...

    Argy

  13. #13
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 739
    Points
    11 739
    Par défaut
    OK, je comprends mieux !

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

Discussions similaires

  1. Problème : Affichage NULL dans zones de textes
    Par tssi555 dans le forum VB.NET
    Réponses: 7
    Dernier message: 11/08/2008, 14h46
  2. Problème champ NULL dans HTTPWebRequest
    Par thelpi dans le forum C#
    Réponses: 1
    Dernier message: 07/07/2008, 13h00
  3. Problème avec SQL dans un tableadapter (select count())
    Par webgig2002 dans le forum VB.NET
    Réponses: 6
    Dernier message: 02/06/2008, 16h08
  4. Problème avec NULL dans HAVING
    Par Jean-Marc68 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 06/11/2007, 15h01
  5. Problème de contrainte dans un "CREATE DOMAIN ..."
    Par VenusX117 dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 15/02/2005, 19h06

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