向视图中插入数据的问题

TechnoFantasy 2002-04-09 03:36:41
两个表:
CREATE TABLE SCOTT.DTEMP (
VNAME VARCHAR2(20) NOT NULL PRIMARY KEY,
VID VARCHAR2(20) NOT NULL
)

CREATE TABLE SCOTT.DTEMPME (
VNAME VARCHAR2(20) NOT NULL PRIMARY KEY,
VSS VARCHAR2(20) NOT NULL
)

在这个基础上建立的视图:
CREATE VIEW SCOTT.BBVIEW AS
select dtemp.vname as pvname, dtemp.vid, dtempMe.* from dtemp,dtempMe

插入数据出现问题:
insert into bbview (pvname, vname, vid, vss) values ('101','102','102','101')
*
ERROR 位于第 1 行:
ORA-01779: 无法修改与非键值保存表对应的列
...全文
447 12 打赏 收藏 举报
写回复
12 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
weinfo 2002-04-09
请复习一下有关VIEW的概念和使用方法
下面是最常遇到的一些限制:
◎ 在多个表上建立的视图不能使用DELETE
◎ 不能使用INSERT,除非基表仲所有NOT NULL列都包含在视图中
◎ 如果通过一个连接视图来插入和更新记录,所有被更新记录都必须
属于同一物理表
◎ 如果用DISTINCT创建视图,则不能INSERT或UPDATE
◎ 不能更新一个虚拟列

  • 打赏
  • 举报
回复
thingsfly 2002-04-09
是很好的方法啊!
  • 打赏
  • 举报
回复
qiujoe 2002-04-09
rwq_(风云浪子)说得对,
我原来就是用视图触发器做的
  • 打赏
  • 举报
回复
xinpingf 2002-04-09
建立在两个以上表上的视图是不能插入数据的
  • 打赏
  • 举报
回复
TechnoFantasy 2002-04-09
等等我试一下,下班送分。
  • 打赏
  • 举报
回复
rwq_ 2002-04-09
还是被我弄出来了:
SQL> CREATE TABLE DTEMP (
2 VNAME VARCHAR2(20) NOT NULL PRIMARY KEY,
3 VID VARCHAR2(20) NOT NULL
4 )
5 ;

表已创建。

SQL> CREATE TABLE DTEMPME (
2 VNAME VARCHAR2(20) NOT NULL PRIMARY KEY,
3 VSS VARCHAR2(20) NOT NULL
4 );

表已创建。


SQL> CREATE VIEW BBVIEW AS
2 select dtemp.vname as pvname, dtemp.vid, dtempMe.* from dtemp,dtempMe where dtemp.vname=dtemp
me.vname;

视图已建立。
----------
建一个TRIGGER:
create or replace trigger BBTrigger
instead of insert on bbview
for each row
declare
-- local variables here
begin
insert into sa.dtemp values(:new.pvname,:new.vid);
insert into sa.DTEMPME values(:new.vname,:new.VSS);
end BBTrigger;

------------


SQL> insert into bbview (pvname, vname, vid, vss) values ('101','102','102','101');

已创建 1 行。




SQL> select *From dtemp;

VNAME VID
-------------------- --------------------
101 102

SQL> select *From DTEMPME;

VNAME VSS
-------------------- --------------------
102 101

SQL>
-------------------------------------------------------
OK!
  • 打赏
  • 举报
回复
rwq_ 2002-04-09
我找了一下资料,不知对你有没有启发:
(通过触发器的INSTEAD OF来修改视图)


CREATE TABLE customers_sj
(
cust NUMBER(6),
address VARCHAR2(50),
credit NUMBER(9,2)
);

CREATE TABLE customers_pa
(
cust NUMBER(6),
address VARCHAR2(50),
credit NUMBER(9,2)
);
CREATE TYPE customer_t AS OBJECT
(
cust NUMBER(6),
address VARCHAR2(50),
credit NUMBER(9,2),
location VARCHAR2(20)
);
CREATE VIEW all_customers (cust)
AS SELECT customer_t (cust, address, credit, ’SAN_JOSE’)
FROM customers_sj
UNION ALL
SELECT customer_t (cust, address, credit, ’PALO_ALTO’)
FROM customers_pa;

CREATE TRIGGER instrig INSTEAD OF INSERT ON all_customers
FOR EACH ROW
BEGIN
IF (:new.cust.location = ’SAN_JOSE’) THEN
INSERT INTO customers_sj
VALUES (:new.cust.cust, :new.cust.address,:new.cust.credit);
ELSE
INSERT INTO customers_pa
VALUES (:new.cust.cust, :new.cust.address, :new.cust.credit);
END IF;
END;
  • 打赏
  • 举报
回复
KingSunSha 2002-04-09
假定两个表用vname字段连接:
CREATE VIEW SCOTT.BBVIEW AS
select dtemp.vname as pvname, dtemp.vid, dtempMe.*
from dtemp,dtempMe
where dtemp.vname = dtempme.vname;

--对view,每次只能向一个基表中插入数据
--在表dtemp中插入一行
insert into bbview (pvname, vid)
values ('101','102');

--在表dtempme中插入一行,vname相同
insert into bbview (vname, vss)
values ('101','102');
  • 打赏
  • 举报
回复
TechnoFantasy 2002-04-09
U.P
  • 打赏
  • 举报
回复
rwq_ 2002-04-09
我看你是通过修改(增加)多个基表来进行操作的,在ORACLE通常都不能这么做!
  • 打赏
  • 举报
回复
TechnoFantasy 2002-04-09
可能是我的视图有问题,请修改一下,只要能插入数据就可以。
  • 打赏
  • 举报
回复
KingSunSha 2002-04-09
你的view中怎么没有两个表的关联?
  • 打赏
  • 举报
回复
发帖
Sybase
加入

2589

社区成员

Sybase相关技术讨论区
社区管理员
  • Sybase社区
申请成为版主
帖子事件
创建了帖子
2002-04-09 03:36
社区公告
暂无公告