1

我有两个结构相同的表。Table1保存已审核的数据,table2保存尚未审核的数据。

表格1

+-----+------------+-----------------+--------+--- --------+----------+
| “身份证” | “名字” | “说明” | “类型” | “国家” | “状态” |
+-----+------------+-----------------+--------+--- --------+----------+
| "1" | “标题1” | “说明1” | "1" | “美国” | "0" |
| "2" | “标题2” | 《说明2》 | "1" | “英国” | "0" |
+-----+------------+-----------------+--------+--- --------+----------+

表 2

    +-----+------------+-----------------+--------+--- --------+----------+
    | “身份证” | “名字” | “说明” | “类型” | “国家” | “状态” |
    +-----+------------+-----------------+--------+--- --------+----------+
    | "1" | “标题1” | “说明1” | "1" | “美国” | "2" |
    | "2" | “标题2” | 《说明2》 | "1" | “英国” | "2" |
    +-----+------------+-----------------+--------+--- --------+----------+

我正在尝试status使用单个 sql 更新两个表中的列。实际上,版主更新只是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

4 回答 4

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行更新,对吧?它不会导致脚本停止运行。– 杰梅内兹

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

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

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

于 2013-06-05T04:44:44.793 回答
1

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

START TRANSACTION;
UPDATE table1 SET summary=@A WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;

希望这有帮助!

于 2013-06-05T04:49:41.577 回答
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演示。

于 2013-06-05T04:33:24.580 回答
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;
于 2013-06-05T04:46:07.827 回答