使用一个sql更新两个不同表中的列

时间:2013-06-05 04:25:51

标签: mysql sql

我有两张结构相同的桌子。 Table1保留审核数据,table2保存尚未审核的数据。

表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"      |
    +------+-----------+-----------------+--------+-----------+----------+

我正在尝试使用单个sql更新两个表中的列status。实际上,主持人只更新table2,因为那是他可以使用的表格。

table2两个更新时,table1可以同时更新吗?使用单个sql?现在,我正在使用2个不同的会话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.

4 个答案:

答案 0 :(得分: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

首先,您需要确保这两个表具有相同的数据:

  • 对于任何插入,您需要插入两个表
  • 对于任何更新,您需要更新两个表
  • 要删除,您需要从两个表中删除

它不会阻止您的脚本运行,但您需要强制执行这些条件。如果两个表不一致,那么有时更新将无法正常工作。没有按预期工作的脚本和抛出错误的脚本之间没有太大区别。他们俩都没有做他们应该做的事情。

答案 1 :(得分:1)

而是使用单个语句更新2个表(这很麻烦),在查询/存储过程中使用Transactions可能是一种更简单的方法。它将确保一次性更新两个表。

START TRANSACTION;
UPDATE table1 SET summary=@A WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;
希望这有帮助!!

答案 2 :(得分: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 演示。

答案 3 :(得分: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;