我有一个类似的架构:
其中zip是zipcodes中的pk和其他表中的fk 我必须编写一个更新查询,它会更新整个数据库中邮政编码4994到1234的全部内容。
update zipcodes,customers,employees
set zip = 0
where customers.zip = zipcodes.zip
and employees.zip = zipcodes.zip;
但我知道我做得不对。有没有办法在单个更新查询中更新所有表格?
答案 0 :(得分:3)
Oracle不支持多表更新语句。
确认ZIPCODES
表
INSERT INTO ZIPCODES
(zip, city)
VALUES
(1234, '?')
为CUSTOMERS和EMPLOYEES表编写单独的更新语句:
UPDATE CUSTOMERS
SET zip = 1234
WHERE zip = 4994
UPDATE EMPLOYEES
SET zip = 1234
WHERE zip = 4994
删除上一段代码:
DELETE FROM ZIPCODES
WHERE zip = 4994
答案 1 :(得分:2)
您无法在一个更新语句中更新多个表。您需要编写多个更新语句。
新思路:你可以添加触发器来更新线路,这样你的应用可以更新1个表格,触发器会传播其余的。
答案 2 :(得分:1)
我认为,您应首先在zipcode表中为新zip插入一个新行,然后更新其余表中的zip,最后删除旧的zipcode。
答案 3 :(得分:1)
我没有测试它 - 但是:SQL语言允许可更新的视图。如果你看here,你会发现Oracle确实支持固有的可更新视图。这样你就可以用一个语句更新更多的表。 3}}对连接有一些限制,但至少应该是可能的。
然而;这显然不适用于您的情况,多个语句可以更好地工作。您可能会考虑“更新级联”,这样您就可以使用具有新邮政编码的城市更新表格,客户和员工将自动更新。
更新:更新级联在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;
/