Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes 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 20/01/2012, 23h33   #1
Invité de passage
 
Inscription : décembre 2011
Messages : 5
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 5
Points : 1
Points : 1
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 :
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 :
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 :
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
HectorPriamide est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2012, 10h10   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 331
Points : 18 331
Envoyer un message via MSN à CinePhil
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é.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2012, 22h28   #3
Invité de passage
 
Inscription : décembre 2011
Messages : 5
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 5
Points : 1
Points : 1
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 :
SQL_MODE="NO_AUTO_VALUE_ON_ZERO"
j'essaye d'executer dans l'onglet SQL de ma BD la commande :
Code :
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
HectorPriamide est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 01h45   #4
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 874
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
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 : 874
Points : 1 361
Points : 1 361
salut,

tu mets pas le @@ dans ton set donc ça ne touche pas explicitement la variable de session, ça devrait marcher:
Code sql :
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
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 19h33   #5
Invité de passage
 
Inscription : décembre 2011
Messages : 5
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 5
Points : 1
Points : 1
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 :
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
HectorPriamide est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 21h31   #6
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 874
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
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 : 874
Points : 1 361
Points : 1 361
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
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 00h12   #7
Invité de passage
 
Inscription : décembre 2011
Messages : 5
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 5
Points : 1
Points : 1
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 :
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 :
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
HectorPriamide est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 22h12   #8
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 874
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
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 : 874
Points : 1 361
Points : 1 361
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...
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2012, 21h25   #9
Invité de passage
 
Inscription : décembre 2011
Messages : 5
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 5
Points : 1
Points : 1
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
HectorPriamide 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 03h07.


 
 
 
 
Partenaires

Hébergement Web