sql - 在同一 MySQL 事务中更新从属表的方法?

标签 sql mysql insert-update

我需要在单个事务中更新两个表。各个查询看起来像这样:

1. INSERT INTO t1 (col1, col2) 
   VALUES (val1, val2) 
   ON DUPLICATE KEY 
      UPDATE col2 = val2;

如果上述查询导致插入,那么我需要在第二个表上运行以下语句:

2. INSERT INTO t2 (col1, col2) 
   VALUES (val1, val2) 
   ON DUPLICATE KEY  
      UPDATE col2 = col2 + val2;

否则,

3. UPDATE t2 
       SET col2 = col2 - old_val2 + val2 
     WHERE col1 = val1; 
   -- old_val2 is the value of 
      t1.col2 before it was updated

现在我首先在 t1 上运行 SELECT,以确定语句 1 是否会导致在 t1 上插入或更新。然后我在事务中运行语句 1 以及语句 2 和语句 3 中的任何一个。我可以通过哪些方式在一次交易中完成所有这些操作?

我想到的方法如下:

UPDATE t2, t1 
   set t2.col2 = t2.col2 - t1.col2 
 WHERE t1.col1 = t2.col2 
   and t1.col1 = val1;

INSERT INTO t1 (col1, col2) 
VALUES (val1, val2) 
ON DUPLICATE KEY 
   UPDATE col2 = val2;

INSERT INTO t2, t1 (t2.col1, t2.col2) 
VALUES (t1.col1, t1.col2) 
ON DUPLICATE KEY 
   UPDATE t2.col2 = t2.col2 + t1.col2 
WHERE t1.col1 = t2.col2 
  and t1.col1 = val1;

不幸的是,MySQL 5.0 中没有多表 INSERT...ON DUPLICATE KEY UPDATE。我还能做什么?

最佳答案

如果您执行 INSERTUPDATE,您的客户端能够获取更改的行数。如何执行此操作取决于您的客户端,但对于多种编程语言,如果成功,您的 INSERT 会返回此数字。

如果您执行 INSERT...ON DUPLICATE KEY UPDATE,您也可以获取此数字,但它并不是您所期望的。如果您插入/更新单行,您会收到 1 作为更改的行数在 INSERT 的情况下和 2 在 UPDATE 的情况下,即使有只有一行发生了变化。您可以使用此数字来决定客户端接下来要运行哪个查询。

不如单个事务那么好,但至少你摆脱了一个SELECT

关于sql - 在同一 MySQL 事务中更新从属表的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2491821/

相关文章:

sql - 使用 join 检索匹配的行

MySQL重复查询

sql - 如何在 T-SQL 中创建 If-Then-Else

sql - Oracle SQL - max() 带有 NULL 值

基于 MySQL 语句的复制 : Does binlog contain exact queries executed on master?

php - 检查是否有任何输入有值(value)

mysql插入重复键更新知道它是否发生

mysql - 如何在创建查询中将变量设置为表名

java - 在 MySQL 中,如何仅在行不存在时插入并仅在现有版本较少时更新

php - 覆盖postgresql表php中的数据