2010-09-23 6 views
3

J'ai besoin de mettre à jour (remplacer) des champs dans une base de données MySQL, mais seulement s'ils ont changé.Comment puis-je insérer dans une base de données uniquement si une valeur a changé?

La table contient un ID, un champ de texte et une date modifiés. Les utilisateurs interrogent les données par ID en fonction de la date à laquelle elles ont été modifiées. C'est-à-dire que si la date est antérieure à la dernière fois que l'utilisateur a interrogé les données, il ne le souhaite pas.

Je voudrais changer la date dans la base de données seulement si le champ de texte est différent du champ de texte existant avec le même identifiant.

Je pourrais interroger les données, comparer le résultat et afficher seulement si les nouvelles données sont différentes, mais c'est beaucoup de frais généraux et la connexion à la base de données est plutôt lente, donc je cherche un moyen de le faire dans une seule requête.

Merci.

+1

Vous ne pouvez pas faire la mise à jour sans tenir compte des données modifiées ou non? C'est juste une requête. –

Répondre

3

Vous pouvez inclure une instruction CASE dans votre requête de mise à jour qui définira le champ de date conditionnelle, comme suit:

UPDATE MyTable 
SET textfield = @newValue, 
datefield = (CASE WHEN textfield <> @newValue THEN NOW() ELSE datefield END); 

Cette requête « définit » la datefield à la même valeur qu'elle contient déjà si la valeur de textfield n'a pas été modifié.

0

Je pense que vous avez répondu à votre propre question ici:

si le champ texte est différent du champ de texte existant avec le même identifiant

en d'autres termes, utilisez l'instruction MySQL CASE pour vérifier si le champ de texte est différent. Si c'est le cas, faites la mise à jour sur le champ de texte et la date. Sinon, ne faites aucune mise à jour. Vous pouvez également effectuer la même vérification dans votre code, ce qui impliquerait moins de déplacements dans la base de données. Cela pourrait alléger le problème de connexion lente à la base de données.

0

Un moyen facile qui peut ne pas exister quand cette question a été posée:

CREATE TRIGGER `TimeTrigger` BEFORE UPDATE ON `MyTable` 
FOR EACH ROW 
BEGIN 
SET NEW.lastUpdate = (CASE WHEN NEW.text <> OLD.text THEN NOW() ELSE NEW.lastUpdate END); 
END; 

connexes: MySQL Trigger after update only if row has changed

0

je me suis trompé par la balise @value que vous avez utilisé et l'ordre est faux, vous devriez essayez quelque chose comme:

UPDATE my_table 
SET 
    updated = (CASE WHEN foo <> 'new_value' THEN NOW() ELSE updated END), 
    foo = 'new_value' 
WHERE id = 11; 
Questions connexes