Bonjour,
Pour mettre à jour une table, je charge un flux xml que je met dans une table temporaire et ensuite je compare les deux tables afin de savoir quelles lignes doivent être mises à jour.
Pour isoler mon problème, j'ai réduit tous cela au minimum.
Soit la table test contenant les données présenté comme ceci :
Soit la table test_temp contenant les données du flux pour mettre ensuite à jour test :
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 CREATE TABLE IF NOT EXISTS `test` ( `id` bigint(20) NOT NULL, `nom` varchar(100) NOT NULL, `date` date DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; -- -- Déchargement des données de la table `test` -- INSERT INTO `test` (`id`, `nom`, `date`) VALUES (1650170, 'BARDET', '2011-08-29'), (1650163, 'THEVENARD', NULL);
Je récupère les données devant etre modifiés en réalisant cette requete :
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 CREATE TABLE IF NOT EXISTS `test_temp` ( `id` bigint(20) NOT NULL, `nom` varchar(100) NOT NULL, `date` date DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; -- -- Déchargement des données de la table `test_temp` -- INSERT INTO `test_temp` (`id`, `nom`, `date`) VALUES (1650170, 'BARDET', '2011-08-29'), (1650163, 'THEVENARD', NULL);
Comme vous pouvez le voir le champ date peut-être NULL.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 $sql = "SELECT st.id, st.nom, st.date FROM test_temp st WHERE NOT EXISTS (SELECT NULL FROM test s WHERE s.id = st.id AND s.nom = st.nom AND s.date = st.date ) ORDER BY st.id LIMIT 100";
Mon problème est que si les champs date valent NULL dans les deux tables pour une ligne donnée, mysql la considère comme différentes.
J'ai l'impression que NULL n'est pas égal à NULL en quelques sortes.
Si le champ date contiens des dates identiques, pas de soucis, ils les voient bien comme identiques.
Peut-on comparer des champs ayant pour valeur null ?
Comment feriez-vous ?
Ai-je fait une erreur quelques part ?
Je suis preneur de toutes informations me fesant avancer.
Merci d'avance.
Yannick
Partager