Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用一个sql更新两个不同表中的列_Mysql_Sql - Fatal编程技术网

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

Mysql 使用一个sql更新两个不同表中的列,mysql,sql,Mysql,Sql,我有两张结构相同的桌子表1保存已审核的数据,表2保存尚未审核的数据 表1 +------+-----------+-----------------+--------+-----------+----------+ | "id" | "name" | "description" | "type" | "country" | "status" | +------+-----------+-----------------+--------+-----------+----------+

我有两张结构相同的桌子<代码>表1保存已审核的数据,
表2
保存尚未审核的数据

表1

+------+-----------+-----------------+--------+-----------+----------+ | "id" | "name" | "description" | "type" | "country" | "status" | +------+-----------+-----------------+--------+-----------+----------+ | "1" | "Title 1" | "Description 1" | "1" | "US" | "0" | | "2" | "Title 2" | "Description 2" | "1 " | "UK" | "0" | +------+-----------+-----------------+--------+-----------+----------+ 我希望做的事情:举例

$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.

您可以通过
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;

这里是演示。

您可以使用以下语法更新两个表

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行已更新, 正确的?它不会导致脚本停止运行杰米内斯

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

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

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

这可能会做到,但我还没有测试过:

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;

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

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

希望这有帮助

重复问题:这个重复的是mysql:为什么你只想使用1个SQL?很抱歉我应该提到我不能使用触发器。已经有一个了。@jmeneze您可能可以将此更新添加到现有触发器中。显示您的触发器,并尝试对其进行排序。我的现有触发器在更新后也会被调用。这是为新职位做的。我正在尝试获取所有触发器的reid,因为table2得到了很多更新<如果NEW.STATUS=0,则代码>开始,然后将值插入到表1中(NULL、NEW.name、NEW.description、NEW.type、NEW.country);如果结束;END@invisal如果失败,将显示
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;
START TRANSACTION;
UPDATE table1 SET summary=@A WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;