更新多个表的查询

时间:2010-03-08 04:59:23

标签: sql oracle sql-update

我有一个类似的架构:

  • 员工(eno,ename,zip,hdate)
  • 客户(cno,cnmae,street,zip,phone)
  • zipcodes(zip,city)

其中zip是zipcodes中的pk和其他表中的fk 我必须编写一个更新查询,它会更新整个数据库中邮政编码4994到1234的全部内容。

update zipcodes,customers,employees  
  set zip = 0  
where customers.zip = zipcodes.zip 
  and employees.zip = zipcodes.zip;  

但我知道我做得不对。有没有办法在单个更新查询中更新所有表格?

6 个答案:

答案 0 :(得分:3)

Oracle不支持多表更新语句。

  1. 确认ZIPCODES

    中存在zipcode“1234”
    INSERT INTO ZIPCODES 
      (zip, city)
    VALUES
      (1234, '?')
    
  2. 为CUSTOMERS和EMPLOYEES表编写单独的更新语句:

    UPDATE CUSTOMERS
       SET zip = 1234
     WHERE zip = 4994
    
    UPDATE EMPLOYEES
       SET zip = 1234
     WHERE zip = 4994
    
  3. 删除上一段代码:

    DELETE FROM ZIPCODES
     WHERE zip = 4994
    

答案 1 :(得分:2)

您无法在一个更新语句中更新多个表。您需要编写多个更新语句。

新思路:你可以添加触发器来更新线路,这样你的应用可以更新1个表格,触发器会传播其余的。

答案 2 :(得分:1)

我认为,您应首先在zipcode表中为新zip插入一个新行,然后更新其余表中的zip,最后删除旧的zipcode。

答案 3 :(得分:1)

我没有测试它 - 但是:SQL语言允许可更新的视图。如果你看here,你会发现Oracle确实支持固有的可更新视图。这样你就可以用一个语句更新更多的表。

然而;这显然不适用于您的情况,多个语句可以更好地工作。您可能会考虑“更新级联”,这样您就可以使用具有新邮政编码的城市更新表格,客户和员工将自动更新。

更新:更新级联在Oracle中不起作用:(因此触发器或多个语句。

答案 4 :(得分:0)

  

使用存储过程。在那里,您可以使用条件语句执行多表操作。

答案 5 :(得分:0)

它可以解决您的问题。您可以根据值

更新或删除for循环
Begin
for Zip_value in 1234.. 4559 loop
update zipcodes
  set zip = 0   
where customers.zip = zipcodes.zip  
  and employees.zip = zipcodes.zip;
  and zipcodes.zip = Zip_value;
update customers
  set zip = 0   
where customers.zip = zipcodes.zip  
  and employees.zip = zipcodes.zip;
  and zipcodes.zip = Zip_value;
update employees   
  set zip = 0   
where customers.zip = zipcodes.zip  
  and employees.zip = zipcodes.zip;
  and zipcodes.zip = Zip_value;
  END LOOP;
commit;
end;
/