2013-06-05 6 views
1

У меня есть две таблицы, которые идентичны по структуре. Table1 содержит данные модератора, table2 содержит данные, которые до сих пор не модерируются.Обновление столбца в двух разных таблицах с одним sql

Таблица 1

 
+------+-----------+-----------------+--------+-----------+----------+ 
| "id" | "name" | "description" | "type" | "country" | "status" | 
+------+-----------+-----------------+--------+-----------+----------+ 
| "1" | "Title 1" | "Description 1" | "1" | "US"  | "0"  | 
| "2" | "Title 2" | "Description 2" | "1 " | "UK"  | "0"  | 
+------+-----------+-----------------+--------+-----------+----------+ 

Таблица 2

 

    +------+-----------+-----------------+--------+-----------+----------+ 
    | "id" | "name" | "description" | "type" | "country" | "status" | 
    +------+-----------+-----------------+--------+-----------+----------+ 
    | "1" | "Title 1" | "Description 1" | "1" | "US"  | "2"  | 
    | "2" | "Title 2" | "Description 2" | "1 " | "UK"  | "2"  | 
    +------+-----------+-----------------+--------+-----------+----------+ 

Я пытаюсь обновить столбец status в обеих таблицах с использованием одного SQL. На самом деле модератор обновляет только table2, так как это доступная ему таблица.

Когда table2 два обновления, может table1 быть обновленным в одно и то же время? Используя один sql? Прямо сейчас, я использую для этого два разных convetional SQL-заявления.

Прямо сейчас я так:

UPDATE table2 set status = 0 where id = spid and country = spcountry;//Update table2 first 

     UPDATE table1 a 
     INNER JOIN table2 b 
     ON a.id = b.id and a.country = b.country 
     SET a.status = b.status 
     WHERE a.id=spid; 

То, что я надеюсь сделать: Пример

$status = 0;//php 

update table1, table2 set status = $status where id=1 and conuntry = 'us' in table1 and table2.//The id and country need to be the same in both tables. 
+0

Duplicate question: http://stackoverflow.com/questions/2044467/how-to-update-two-tables-in-one-statement-in-sql-server-2005 –

+0

Этот дубликат - это mysql: http://stackoverflow.com/questions/8765490/mysql-update-two-tables-at-once –

+0

Почему вы хотите использовать только 1 SQL? – Raptor

ответ

2

В то время как вы можете обновить две таблицы со следующим синтаксисом

UPDATE TBL1, TBL2 
SET TBL1.status = 'Blah', TBL2.status = 'blah' 
WHERE TBL1.id = TBL2.id 
     AND TBL2.id = 2; 

, но это может быть вредным. Рассмотрим следующий случай: когда TBL2 содержит строку с id = 2, тогда как TBL1 не имеет строки с id = 2. Это приводит к сбою обновления. Чтобы это работало, TBL1 и TBL2 должны быть точно такими же. И если эти две таблицы точно такие же, зачем вообще не иметь двух таблиц?


@invisal Если это не удается, все, что будет происходить это будет сказать, 0 строк обновляется, правильно? Это не приведет к прекращению работы скрипта. - jmenezes

Во-первых, вы должны убедиться, что эти две таблицы имеют одинаковые данные:

  • Для любой вставки, вам нужно вставить в две таблицы
  • Для любого обновления, вам необходимо обновить две таблицы
  • для удаления, необходимо удалить из двух таблиц

Это не останавливает свой скрипт работает, но вы должны т o обеспечить соблюдение этих условий. Если две таблицы не являются консистенциями, поэтому иногда обновление не будет работать.Между сценарием, который не работает так, как предполагалось, и скриптом, который генерирует ошибку, не так много отличается. Оба они не могут делать то, что должны делать.

+0

Ничего, вы узнаете что-то новое на SO каждый день :) –

+0

@invisal Если это не удастся, все, что произойдет, это скажет «0 строк обновлено», правильно? Это не приведет к прекращению работы скрипта. – jmenezes

+0

Конечно, это не остановит запуск скрипта, но у вас будут непоследовательные данные, которые вводят новую ошибку, которую сложно отладить позже. – invisal

0

Вы можете достичь своей цели с триггером на table2

CREATE TRIGGER tg_table2_update 
AFTER UPDATE ON table2 
FOR EACH ROW 
    UPDATE table1 
    SET status = NEW.status 
    WHERE id = NEW.id AND country = NEW.country; 

Адрес SQLFiddle демо.

+0

Прошу прощения, я должен был упомянуть, что я не могу использовать триггеры. Там уже есть один. – jmenezes

+0

@jmenezes Вы можете добавить это обновление к существующему триггеру. Покажите свой триггер и попытайтесь разобраться. – peterm

+0

Мой существующий триггер также вызывается после обновления. Это делается для новых сообщений. Я пытаюсь восстановить все триггеры, потому что table2 получает так много обновлений. 'BEGIN \t IF NEW.STATUS = 0 THEN \t \t INSERT INTO table1 VALUES (NULL, NEW.name, NEW.description, NEW.type, NEW.country); \t END IF; END' – jmenezes

0

Это, вероятно, сделать это, но я не проверял:

begin transaction t1; 

UPDATE table2 
    set status = 0 
    where id = spid and country = spcountry; 

UPDATE table1 a INNER JOIN table2 b ON a.id = b.id and a.country = b.country 
    SET a.status = b.status 
    WHERE a.id=spid; 

commit transaction t1; 
1

Скорее собирается обновить 2 таблицы с помощью одного оператора (который является громоздким), он может быть легко п безопасный способ использовать Transactions в вашей процедуре Query/Store. Он обеспечит обновление для обеих таблиц в пути.

START TRANSACTION; 
UPDATE table1 SET [email protected] WHERE type=1; 
UPDATE table2 SET [email protected] WHERE type=1; 
COMMIT; 

надеюсь, что эта помощь !!

Смежные вопросы