倒底什么是键保留表

wcjok 2004-10-19 04:58:07
在做复杂视图时,如何判断哪一个键保留表?
...全文
386 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wcjok 2004-10-21
  • 打赏
  • 举报
回复
还有没有高手可以帮我解决这个问题?
dinya2003 2004-10-20
  • 打赏
  • 举报
回复
视图中如果涉及到两个以上的表.不好直接更新视图,如果只从一个表查数据,则该视图可以更新,

如果视图两个以上的表组成, 要更新视图数据,可以考虑使用替代触发器来更新基表.
wcjok 2004-10-20
  • 打赏
  • 举报
回复
就算是把“update orders set odate=odate+1 where orderno='a10';”
改为“update orders set odate=odate+1 where itemcode='b10';”
错误也是一样的!

zmgowin 2004-10-20
  • 打赏
  • 举报
回复
视图中的数据和基本表中的数据不是一一对应?
wcjok 2004-10-20
  • 打赏
  • 举报
回复
我再给各位大虾举详细的一个例子:

CREATE TABLE order_master(
orderno VARCHAR2(5) primary key,
Odate DATE,
Vencode VARCHAR2(5),
ostatus CHAR(1),
del_date DATE);

CREATE TABLE order_detail(
itemcode VARCHAR2(5) primary key,
qty_ord NUMBER(5),
qty_deld NUMBER(5),
orderno VARCHAR2(5),
foreign key(orderno) references order_master(orderno));

insert into order_master values(
'o001',sysdate,'CHINA','P',sysdate);
insert into order_detail values(
'b10',200,200,'o001');

CREATE VIEW orders
AS SELECT o.orderno, o.odate, vencode, itemcode, qty_ord
FROM order_master o, order_detail d
WHERE o.orderno=d.orderno;

下列语句可以修改视图成功:
update orders set qty_ord=qty_ord*2 where itemcode='b10';

视图不允许使用下面的UPDATE语句:
update orders set odate=odate+1 where orderno='a10';
此语句失败,并返回ORA-01779错误(“无法修改与非键值保存表对应的列”),因为它试图修改基础表ORDER_MASTER,而ORDER_MASTER表在ORDERS视图中不是键保留表。

请问大虾们就在这个例子中,如何确定键保留表?
xbm2008 2004-10-20
  • 打赏
  • 举报
回复
不是标准名词, 不予理会
dinya2003 2004-10-20
  • 打赏
  • 举报
回复
是不是国人翻译外国人的书? 觉得费解! 看不大懂.
wcjok 2004-10-20
  • 打赏
  • 举报
回复
dinya2003(OK) 你说的不对,正因为有键保留表所以有时可以不用替代触发器
wcjok 2004-10-19
  • 打赏
  • 举报
回复
我把书上原话给你说一下,你能给我解释?
键保留表是复杂视图(使用多个表创建的视图)中的表,该表的主键列全部显示在视图中,并且它们的值在视图中都是唯一且非空的。包含外部联接的视图通常不包含键保留表,除非外部联接生成非空的值。如果表的每一个键还可以是视图结果集中的键,则该表是一个键保留表。
lialin 2004-10-19
  • 打赏
  • 举报
回复
不是很明白你的意思哦?

17,378

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧