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