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 :

Update sur un champ NOT NULL avec une valeur NULL sans erreur


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2011
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2011
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Update sur un champ NOT NULL avec une valeur NULL sans erreur
    Bonjour,

    je débute en SQL et je ne trouve pas de solution à ce problème.

    voici ma table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE IF NOT EXISTS `audiences` (
      `Id_audience` char(4) COLLATE utf8_unicode_ci NOT NULL,
      `Lib_audience` char(30) COLLATE utf8_unicode_ci NOT NULL,
      PRIMARY KEY (`Id_audience`),
      UNIQUE KEY `Lib_audience` (`Lib_audience`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    voici ma requete que j'esperais voir planter !!! (pour interception)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE audiences set Lib_audience = NULL
    				WHERE Id_audience = "2"
    le champ 'Lib_audience' étant NOT NULL, je pensais que cela aurait du planter (en INSERT, j'ai effectivement le plantage).

    voici le contenu de la table après la manip :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO `audiences` (`Id_audience`, `Lib_audience`) VALUES
    ('2', ''),
    ('1', '1'),
    ('AAAA', 'ksdfhksdh111111cc');
    Ma valeur NULL a été convertit en Empty. Pourquoi ?

    merci d'avance pour votre aide.
    Hector

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Parce qu'une colonne CHAR ou VARCHAR NOT NULL a pour valeur par défaut une châine vide si cela n'est pas spécifié.

    Au passage, un CHAR(4) comme clé primaire, ce n'est pas une très bonne clé.

  3. #3
    Futur Membre du Club
    Inscrit en
    Décembre 2011
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2011
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Salut,

    Que la colonne ait une valeur par défaut (dans mon cas "aucune" mais comme tu dis, pour un CHAR c'est certainement chaine vide) OK, mais là, explicitement je lui demande, dans l'Update, de mettre NULL. Donc je m'attendais à une erreur.

    A priori, on me dit que cela est dû au sql_mode qui n'est pas strict et donc, qui provoque ce que tu décris alors que si il était en mode strict, j'aurais le fonctionnement souhaité.

    Mais là, nouveau problème, je ne parviens pas à basculer ma base (via phpmyadmin) en mode strict.

    Dans mon SQL DUMP, j'ai la ligne SET :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQL_MODE="NO_AUTO_VALUE_ON_ZERO"
    j'essaye d'executer dans l'onglet SQL de ma BD la commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET sql_mode = STRICT_TRANS_TABLES;
    la requête passe avec succès mais pas le résultat escompté. Dans mon SQL DUMP, toujours le même mode activé et si j’exécute : SELECT @@sql_mode;je n'ai pas d'erreur mais il ne me retourne aucune valeur.

    Autre bizarrerie : si j’exécute le SET et le Select en une passe, cette fois le select me sort bien : STRICT_TRANS_TABLES !!!!
    par contre, dans la réalité, toujours pas de mode strict activé.

    Qu'est ce que je rate ?

    ps : je suis en Localhost sous root qui a tous les privilèges.

    merci d'avance,
    Hector

  4. #4
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    salut,

    tu mets pas le @@ dans ton set donc ça ne touche pas explicitement la variable de session, ça devrait marcher:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SET @@sql_mode = STRICT_TRANS_TABLES;

    le même nom de variable sans rien devant ou avec @ (globale), @@ (session)... c'est pas du tout la même chose pour lui

  5. #5
    Futur Membre du Club
    Inscrit en
    Décembre 2011
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2011
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Malheureusement, toujours pas de réussite. Je ne connaissais pas ces notions de sessions.

    Il ne manquerait pas un genre de commit quelque part ?

    de plus, dans mon sql dump, j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"
    pourtant, lorsque je fais des SELECT sql_mode (avec 1 ou 2 @) j'ai, soit rien, soit NULL. Où est stocké ce "NO_AUTO_VALUE_ON_ZERO" ?

    merci merci,
    Hector

  6. #6
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    déjà c'est donc aussi:

    et en plus, c'est pas une chaine de caractère la valeur à mettre dedans sauf si tu le passe en ligne de commande...lis ça

  7. #7
    Futur Membre du Club
    Inscrit en
    Décembre 2011
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2011
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Ok.
    Lorsque je lance la console Mysql et que j'effectue un update NULL sur un champ Non NULL => pas d'erreur (c'est embêtant)

    J’exécute alors la commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set sql_mode = 'STRICT_ALL_TABLE';
    puis mon update à nouveau et là parfait, j'ai un dump.

    Effectivement, si je lance : j'ai en résultat : STRICT_ALL_TABLES

    rq: j'ai aussi effectué un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set @@sql_mode = 'STRICT_ALL_TABLE';
    Je vais ensuite dans phpmyadmin et j'essaye d'effectuer le UPDATE depuis l'onglet SQL => pas de DUMP !!! (zut)

    si je lance un select @@sql_mode, je n'ai pas de résultat.

    Donc au final, je ne sais toujours pas comment m'y prendre. Comment faire pour que mon SET reste actif (si je quitte la console et je reviens, j'ai perdu ma valeur dans le sql_mode et donc mon update ne Dump plus)
    dans la console et dans mon phpmyadamin.

    désolé, je n'ai vraiment aucune notion d'admin sql.

    merci,
    Hector

  8. #8
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    attention... si tu passes par la console et phpmyadmin ce sont 2 connexions en parallèle et indépendantes...

    or ce réglage n'affecte que la connexion en cours pour la durée de la session...

    en gros, si tu lances 4x la console mysql tu as 4 connexions avec leurs réglages propres...

    la seule configuration "partagée" est celle du fichier de configuration du serveur qui définit le comportement du serveur et du client...

    quand tu modifies une variable de configuration, cela ne touche que le contexte ou la session selon sont niveau d'action...

    phpmyadmin est très limité de par sa façon de gérer les commandes 1 à 1... il peut même pas exécuter une procédure stockée...

    si tu développes sous windows, utilise un client comme heidisql, là tu auras plus de limitation et c'est un logiciel opensource....

    quand tu fais une action où tu veux un comportement spécifique... soit:
    • tu maintiens la connexion active tant que c'est nécessaire
    • tu repasse les commandes set de configuration à chaque lancement de la connexion
    • tu crée une procédure stockée qui englobe tes commandes de configuration et tes requêtes, du coup tu limites les échanges avec mysql: plus rapide et tu es sur d'avoir un comportement pour chaque requête...

  9. #9
    Futur Membre du Club
    Inscrit en
    Décembre 2011
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2011
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Un grand merci. Grâce à tes indications, j'ai pu débloquer la situation.
    J'execute une requete contenant le SET sql_code juste après l'instanciation de ma base dans mon code php.

    Hector

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

Discussions similaires

  1. [AC-2010] probleme avec une valeur null sur une date
    Par kynder surprise dans le forum VBA Access
    Réponses: 3
    Dernier message: 07/05/2012, 17h28
  2. remplir un dataset avec une valeur null
    Par bellak dans le forum Windows Forms
    Réponses: 5
    Dernier message: 21/10/2008, 18h49
  3. Réponses: 2
    Dernier message: 21/12/2007, 16h05
  4. [SQL-Server] SQRetourner une valeur NULL avec un mssql_fetch_array
    Par arnolem dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 03/08/2007, 16h22
  5. Réponses: 39
    Dernier message: 11/01/2007, 11h31

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