向视图中插入数据的问题

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: 无法修改与非键值保存表对应的列
...全文
567 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
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中怎么没有两个表的关联?

2,598

社区成员

发帖
与我相关
我的任务
社区描述
Sybase相关技术讨论区
社区管理员
  • Sybase社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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