【问题标题】:Oracle update same column in several tablesOracle 更新多个表中的同一列
【发布时间】:2021-02-18 13:36:55
【问题描述】:

我的数据库中的多个表中有一个列person_id。我正在删除 individuals table 中的重复项,并且需要更新其余表中的 person_id

我的架构是clud,我的表是:

address
cases
child_cases
matter_person
phone
individuals

如何一次更新所有表格而不是单独更新?

个人表

person_id | first_name | last_name
----------------------------------
100        John         Doe
101        John         Doe  (duplicate value)

我想删除 person_id 为 101 的记录,我需要将所有其他表中的 person_id 更改为 100,其中 person_id 为 101。

病例表

person_id | case_number
-----------------------
100        12345
101        6789  

结果

person_id | case_number
-----------------------
100        12345
100        6789

matter_person 表

person_id | matter_number
-------------------------
100         123abc
101         456def

结果

person_id | matter_number
-------------------------
100        123abc
100        456def

【问题讨论】:

  • 请提供样本数据和期望的结果。
  • 在 SQL 的基于集合的范例和 RDBMS 的基于事务的ACID 框架中,您将无法一次更新所有表
  • @GordonLinoff 示例数据在上面
  • 您需要一个 SQL 事务来更新所有引用 Individuals 表的表中的person_id,然后删除重复的人员记录,最后提交事务。

标签: sql oracle


【解决方案1】:

你可以使用动态SQL比如

DECLARE
  v_pid_new individuals.person_id%type := 100;
  v_pid_old individuals.person_id%type := 101;  
BEGIN
  FOR c IN ( SELECT * FROM user_tab_cols WHERE column_name = 'PERSON_ID' )
  LOOP
   IF c.table_name = 'INDIVIDUALS' THEN
     EXECUTE IMMEDIATE 'DELETE '||c.table_name||' WHERE person_id=:pido' USING v_pid_old;     
   ELSE
     EXECUTE IMMEDIATE 'UPDATE '||c.table_name||' SET person_id=:pidn WHERE person_id=:pido' USING v_pid_new,v_pid_old;  
   END IF;  
     COMMIT;
  END LOOP; 
END;
/

Demo

【讨论】:

  • 如果在外键约束中使用了 person_id,则可能需要对语句进行排序,以便在父表之前更新子表。可能还有其他挑战(例如,一个人只能有一个当前/主要地址)
  • 好吧,谢谢@GaryMyers,这也可以考虑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 2016-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多