Могу ли я обновить две одинаковые таблицы одним запросом - MySQL - PullRequest
1 голос
/ 28 июля 2010

Могу ли я обновить две идентичные таблицы одним запросом?

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      |    
|_____________|_____________| 

Я хочу обновить обе таблицы (SET value = 'z' WHERE id=3) одновременно. Возможно ли это?

-Спасибо

Ответы [ 4 ]

2 голосов
/ 28 июля 2010

Можно обновить их одновременно, но не с помощью одного оператора SQL (хорошо, но это не рекомендуется). В этом и заключается весь смысл транзакций: вы обновляете каждую таблицу по отдельности, но эти изменения не вступают в силу, пока вы не подтвердите. Для любого другого пользователя таблицы обновляются одновременно.

Если вы действительно настаиваете на обновлении обоих в одном операторе, может сработать следующее, но это зависит от того, имеют ли обе таблицы ID в качестве первичного ключа, и может зависеть от конкретной используемой вами СУБД:

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
2 голосов
/ 28 июля 2010

, читая ссылку на обновление MySQL, сообщает:

Для синтаксиса с несколькими таблицами UPDATE обновляет строки в каждой таблице, названной в table_references, которые удовлетворяют условиям.В этом случае нельзя использовать ORDER BY и LIMIT.

ОБНОВЛЕНИЕ элементов, месяц SET items.price = month.price WHERE items.id = month.id;

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

1 голос
/ 28 июля 2010

Большинство СУБД позволяют вставлять, обновлять или удалять только по одной таблице за раз. Если у вас есть внешние ключи и каскад, то некоторые вставки и дельты могут выполняться в нескольких таблицах

Однако, если вы используете реляционную базу данных, у вас не должно быть двух таблиц, которые требуют одинакового обновления. Одним из драйверов реляционных баз данных является целостность данных, что отношение хранится только одним способом. E / g / в этом случае, если id 3 означает, что значение равно c (или z после изменения), отношение должно храниться только в одном месте.

1 голос
/ 28 июля 2010

MySQL поддерживает обновления нескольких таблиц , используя следующий синтаксис:

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

Контрольный пример:

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');

Результат:

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)

UPDATE:

Если вы предпочитаете не повторять значение, которое собираетесь установить дважды, вы можете использовать следующий прием:

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');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...