我刚刚发现派生表在oracle中是可更新的。更新派生表时,它所基于的表将作为结果进行更新。
示例UPDATE (SELECT * FROM T where T.col1='val1') as D SET D.col2 ='some_val'
执行示例sql后,将更新表T.
我不明白为什么Oracle支持此功能。
如this question所述,在mysql中,派生表不可更新。
答案 0 :(得分:5)
查看关系数据库的Codd's Rules可能是有益的。
规则7是:
规则7:高级插入,更新和删除:
将基本关系或派生关系作为单个操作数处理的能力不仅适用于数据检索,还适用于数据的插入,更新和删除。
我的重点 - 并注意到许多人在关系数据库中出错的一个重要方面是"关系"或"关系" mean - relations 是SQL中所谓的 tables 。许多人假设"关系"在关系数据库中,与实体关系模型中的关系是相同的 - 因此可以假设关系在某种程度上与例如关系数据库有关。外键。
现在,我并不是说SQL,无论是ANSI标准中体现的,还是体现在任何特定产品中的,都是Codd规则的完整实现(事实上,规则6很成问题) ,但至少尝试在某些产品中实现它们。