2010-07-28 6 views
1

Puis-je mettre à jour deux tables identiques avec une requête?Puis-je mettre à jour deux tables identiques avec une seule requête - MySQL

TABLEA 
_____________________________ 
|  id  | value  | 
|_____________|_____________| 
|  1  |  a  | 
|  2  |  b  | 
|  3  |  c  | 
|  4  |  d  | 
|  5  |  e  |  
|_____________|_____________| 

TABLEB 
_____________________________ 
|  id  | value  | 
|_____________|_____________| 
|  1  |  a  | 
|  2  |  b  | 
|  3  |  c  | 
|  4  |  d  | 
|  5  |  e  |  
|_____________|_____________| 

Je veux mettre à jour les deux tables (SET value = 'z' WHERE id=3) en même temps. Est-ce possible?

-Merci

+0

Quel SGBD utilisez-vous? –

+1

? La DB est MySQL et la langue est PHP – calumbrodie

+0

Désolé, n'a pas remarqué le titre. Ajout de la balise 'mysql'. –

Répondre

1

MySQL supporte multiple-table updates utilisant la syntaxe suivante:

UPDATE tablea, tableb 
SET tablea.value = 'z', tableb.value = 'z' 
WHERE (tablea.id = tableb.id) AND (tablea.id = '3'); 

Cas de test:

CREATE TABLE tablea (id int, value char(1)); 
CREATE TABLE tableb (id int, value char(1)); 

INSERT INTO tablea VALUES (1, 'a'); 
INSERT INTO tablea VALUES (2, 'b'); 
INSERT INTO tablea VALUES (3, 'c'); 
INSERT INTO tablea VALUES (4, 'd'); 
INSERT INTO tablea VALUES (5, 'e'); 

INSERT INTO tableb VALUES (1, 'a'); 
INSERT INTO tableb VALUES (2, 'b'); 
INSERT INTO tableb VALUES (3, 'c'); 
INSERT INTO tableb VALUES (4, 'd'); 
INSERT INTO tableb VALUES (5, 'e'); 

Résultat:

SELECT * FROM tablea; 
+------+-------+ 
| id | value | 
+------+-------+ 
| 1 | a  | 
| 2 | b  | 
| 3 | z  | 
| 4 | d  | 
| 5 | e  | 
+------+-------+ 
5 rows in set (0.00 sec) 

SELECT * FROM tableb; 
+------+-------+ 
| id | value | 
+------+-------+ 
| 1 | a  | 
| 2 | b  | 
| 3 | z  | 
| 4 | d  | 
| 5 | e  | 
+------+-------+ 
5 rows in set (0.00 sec) 

MISE À JOUR:

Si vous préférez ne pas répéter la valeur que vous allez mettre deux fois, vous pouvez utiliser l'astuce suivante:

UPDATE tablea, tableb, (SELECT 'z' val) d 
SET tablea.value = d.val, tableb.value = d.val 
WHERE (tablea.id = tableb.id) AND (tablea.id = '3'); 
+0

Je suis arrivé moi-même après votre première réponse - très simple - merci pour votre réponse rapide. – calumbrodie

+0

juste remarqué ce n'est pas vous qui a fourni cette première réponse - j'ai marqué votre anser comme correct parce que vous avez donné la première solution complète @frabiacca Merci pour le lien - Je me suis deviné avec la bonne ligne de La documentation. Je ne trouve pas les docs MySQL les plus faciles à lire (formatage médiocre) :-) – calumbrodie

+0

Oui, [@frabiacca] (http://stackoverflow.com/questions/3354507/can-i-update-two-identical-tables -in-avec-une-requête-mysql/3354572 # 3354572) m'a battu par 44 secondes ... J'ai mis à jour ma réponse avec une solution alternative comme un "merci" pour accepter ma réponse :) –

2

en lisant référence de mise à jour de MySQL, il est dit:

Pour la syntaxe multi-tables, UPDATE met à jour les lignes dans chaque table nommée dans table_references qui satisfont aux conditions . Dans ce cas, ORDER BY et LIMIT ne peuvent pas être utilisés.

Mettre à jour les éléments, le mois SET articles.price = month.price O WH items.id = month.id;

http://dev.mysql.com/doc/refman/5.0/en/update.html

+0

Merci pour cet extrait de la docs - Je ne pouvais pas le trouver pour regarder – calumbrodie

2

Il est possible de les mettre à jour à en même temps, mais pas avec une seule instruction SQL (d'accord, c'est, mais ce n'est pas recommandé). C'est à peu près tout le point des transactions: vous mettez à jour chaque table individuellement, mais ces changements ne prennent effet qu'après validation. Pour tout autre utilisateur, les tables sont mises à jour simultanément.

Si vous êtes vraiment insistant sur la mise à jour à la fois dans une instruction, ce qui suit pourrait fonctionner, mais cela dépend des deux tables ayant ID comme clé primaire et peut dépendre des SGBDR spécifiques que vous utilisez:

update (select tablea.id, 
       tablea.value v1, 
       tableb.value v2 
     from tablea 
      join tableb 
      on tablea.id = tableb.id) 
set v1 = 'z' 
where id = 3 
+0

Salut, merci pour votre réponse - La solution était encore plus simple que la requête fournie. J'ai mentionné MySQL dans le titre de la question :-) – calumbrodie

+0

@calumbrodie: J'aurais pu jurer d'avoir vu ça quelque part, mais quand je suis retourné vérifier, je ne suis pas allé jusqu'au titre ... – Allan

1

La plupart des SGBDR vous permettent uniquement d'insérer, de mettre à jour ou de supprimer directement sur une table à la fois. Si vous avez des clés étrangères et des cascades, certaines insertions et suppressions peuvent être activées dans plusieurs tables.

Cependant, si vous utilisez une base de données relationnelle, vous ne devriez pas avoir deux tables nécessitant la même mise à jour. L'un des pilotes de ces bases de données relationnelles est l'intégrité des données qu'une relation est détenue d'une seule manière.e/g/dans ce cas si id de 3 signifie que la valeur est c (ou z après un chnage) la relation ne doit être tenue qu'à un endroit

+0

Je suis conscient de cela - je n'ai pas conçu la base de données :-) – calumbrodie