关于将更新和插入查询组合到 mysql 中的单个查询的查询

Sar*_*nan 9 mysql

我想跟踪用户的更改历史记录,以便每当他更改他的个人资料时,我都需要获取旧数据并存储在历史记录中并使用新数据进行更新。

我可以使用 aselect来获取旧数据,然后使用insert历史记录,最后使用 aupdate来更改数据。

我可以在不使用存储过程、触发器等的情况下在 mysql 的单个查询中拥有所有这些吗?例如使用锁等。如果是这样,请给我一个小样本。

Jac*_*las 13

要做到这一点,而不阻塞另一个用户尝试更新在同一时间相同的配置文件的风险,你需要锁定该行t1第一,然后使用一个交易(如罗兰在评论你的问题指出):

start transaction;
select id from t1 where id=10 for update;
insert into t2 select * from t1 where id=10;
update t1 set id = 11 where id=10;
commit;
Run Code Online (Sandbox Code Playgroud)