【问题标题】:How can I update three tables at the same time?如何同时更新三个表?
【发布时间】:2020-04-05 09:52:02
【问题描述】:

现在有三个表存储玩家信息并且具有完全相同的表结构。如何同时更新所有三个表?

例如,将一个表中ID为305的国籍更改为“AUS”。

UPDATE ATHLETE1
SET CCODE = 'AUS'
WHERE ATHLETEID = 305;

如何对具有相同表结构的三个表(ATHLETE1、ATHLETE2、ATHLETE3)执行此过程。 像这样:

UPDATE ATHLETE1, ATHLETE2, ATHLETE3
SET CCODE = 'AUS'
WHERE ATHLETEID = 305;

【问题讨论】:

  • 为什么运动员 305 存储在三个具有相同 ccode 值的相同表中?
  • 我不明白这个问题。为什么不能在单个事务中简单地运行三个 UPDATE?但是你应该真的修复你的数据模型。
  • 非常感谢您的回复。这实际上是一种将大数据表拆分为三个较小的表,然后更新三个较小的表的做法,所以想知道是否可以更新三个表直接或一个一个。这是一个关于 SQL 的练习,所以我可以通过“更新”来做到这一点 - caicaicai_Pro 2 秒前

标签: sql oracle plsql sql-update


【解决方案1】:

除了为什么你的数据模型是这样的问题之外,一般的答案是你可以使用 PL/SQL 过程:

create or replace procedure set_athlete_country
    ( p_athleteid  athlete1.athleteid%type
    , p_ccode      athlete1.ccode%type )
as
begin
    update athlete1
    set    ccode = p_ccode
    where  athleteid = p_athleteid;

    update athlete2
    set    ccode = p_ccode
    where  athleteid = p_athleteid;

    update athlete3
    set    ccode = p_ccode
    where  athleteid = p_athleteid;

end set_athlete_country;

现在您可以在一个成功或失败的单个调用中作为一个整体执行所有相关更改。

call set_athlete_country(305, 'AUS');

【讨论】:

  • 非常感谢您的回复。这实际上是一个将大数据表拆分为三个较小的表然后更新三个较小的表的练习,所以我想知道是否可以更新三个表直接或一个一个。这是一个关于 SQL 的练习,所以我可以通过“更新”来做到这一点 – caicaicai_Pro 2 秒前
  • 我确实想知道我们是否可以更新 union all 内联视图(即 update (select ...union all select...) set ccode = 'AUS' where...),但这会导致 ORA-01732:在此视图上数据操作操作不合法。因此,除非您创建一个独立视图并在其上定义 instead of 触发器,否则我认为 PL/SQL 或脚本是唯一的选择。
【解决方案2】:

您可以使用PL/SQL dynamic query

SQL> declare
 v_ccode athlete1.ccode%type := 'AUS';
 v_id    athlete1.athlete_id%type := 305;
begin
 for i in 1..3 loop
   execute immediate 'update athlete'||i||' 
                         set ccode = :code 
                       where athlete_id = :id' using v_ccode,v_id;  
 end loop;
  commit;
end;
/

但请注意,不可能在单个 SQL 更新语句中更新所有这三个表。

【讨论】:

  • 非常感谢您的回复。这实际上是一个将大数据表拆分为三个较小的表然后更新三个较小的表的练习,所以我想知道是否可以更新三个表直接或一个一个。这是关于 SQL 的一种做法,所以我可以通过“更新”来做到这一点
  • 我的意思是我可以使用'update'来查询和更新多个表吗?
  • 不,这在单个语句中是不可能的@caicaicai_Pro。
  • 你也是,在家里保重 :) @xRandom 就像我们所做的一样。
【解决方案3】:

首先,我认为您的数据库设计不好。您应该将所有运动员存储在比方说 Athletes 表中,这样您就可以使用该 ID 更新所有运动员。

原来是这样:

UPDATE athletes 
SET ccode = 'AUS' 
WHERE athleteid = 3;

【讨论】:

  • 非常感谢您的回复。这实际上是一个将大数据表拆分为三个较小的表然后更新三个较小的表的练习,所以我想知道是否可以更新三个表直接或一个一个
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-19
  • 2018-10-28
  • 2011-01-19
相关资源
最近更新 更多