2011-04-03 4 views
2

Ce que je dois faire est: - Supprimer une entrée de la table formfields - Mettre à jour tous les champs avec commande> (commande du champ supprimé) - Définir l'ordre des champs mis à jour au courant valeur moins 1 (par exemple si la commande en cours sur le champ est 8, alors il devrait être mis à 7).Mise à jour d'une table mysql. un champ = old_value - 1

Est-ce possible dans une requête? Ou comment puis-je y arriver?

Répondre

7

Vous pouvez configurer une transaction pour cela en même temps.

Compte tenu du tableau suivant:

CREATE TABLE `formfields` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(25) NOT NULL, 
    `order_no` int(11) NOT NULL, 
    PRIMARY KEY (`id`) 
); 

Vous pouvez faire quelque chose comme ce qui suit:

START TRANSACTION; 
DELETE FROM formfields WHERE order_no = {YOUR_NUM}; 
UPDATE formfields SET order_no = order_no - 1 WHERE order_no > {YOUR_NUM}; 
COMMIT; 
2

Vous ne peut évidemment pas faire la DELETE et la UPDATE dans la même requête, mais vous pouvez utiliser InnoDB, démarrer une transaction, exécutez la requête de suppression et utilisez une requête de mise à jour tels que ...

UPDATE formfields SET field_value = field_value - 1 
WHERE field_value >= <VALUE YOU'VE JUST DELETED> 

... avant de valider la transaction. Faire les deux requêtes dos à dos à l'aide d'une table MyISAM fonctionnera neuf fois sur dix (selon la charge, etc.), mais vous ne devriez vraiment pas y aller.