2010-11-24 4 views
0

Dans mon projet, je me sers d'une table MySQL pour stocker réelle information pour tous les id (champs inutiles sont omis):Choisir requête MySQL correcte

CREATE TABLE mytable (
    `id` varchar(8) NOT NULL, 
    `DateTime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM 

Je dois mettre à jour les lignes dans ce tableau et insérer de nouvelles DateTimeseulement si ce DateTime entrant est plus récent. Mais en même temps je ne sais pas si la ligne avec tel id existe déjà dans la table. Voici le pseudo-code de ce que je voudrais obtenir:

if id does not exist 
    insert id and DateTime 
else if newDateTime > DateTime 
    update DateTime 
  • J'ai essayé d'utiliser le remplacer, mais pour autant que je sache, il est impossible de comparer les champs de l'intérieur remplacer le corps.
  • J'ai essayé d'utiliser la mise à jour, mais si la ligne n'existe pas, les nouvelles informations ne sont pas insérées.

Est-il possible de faire quelque chose comme ça dans une requête? Et si non - quelle pourrait être la solution de contournement? PS: Je ne pense pas que j'ai la permission d'ajouter des procédures stockées, donc cela devrait être un dernier recours.

+1

fyi, il est recommandé de ne pas utiliser les mots réservés pour les noms de champs. sinon, vous devrez toujours échapper le 'DateTime' en backticks. J'utilise souvent un champ 'stamp', ou vous pouvez essayer 'date_time'. – zanlok

+0

@zanlok Mon projet utilise une base de données déjà existante, je ne peux pas changer les noms de champs. – Zhukikov

+0

N'existe-t-il aucune programmation autre que SQL? Qu'est-ce que l'envoi de cette requête? – johnny

Répondre

2

J'ai testé cela et cela fonctionne. Et j'en suis assez fier.

INSERT INTO mytable (`id`,`DateTime`) 
VALUES ('your_new_id','your_new_DateTime') 
ON DUPLICATE KEY UPDATE `DateTime` = IF(`DateTime` < 'your_new_DateTime', 'your_new_DateTime', `DateTime`) 
+0

Exactement ce que je cherchais! J'aurai probablement besoin de "SI" tous les champs que je veux mettre à jour, mais cela devrait fonctionner. – Zhukikov