2012-01-11 35 views
6

一個專欄中,我有t1有表no number(3)name varchar2(20)不能修改它映射到非鍵保存表的錯誤,而試圖插入一個視圖

而且emp爲表empnoenamejob等欄目。

現在我creatng視圖

create view v_t as select * from t1,emp; 

它創建視圖。然後,我想裏面插入v_t是鑑於值,但它給了我錯誤

不能修改映射到一個非關鍵保留的表

here is one link

什麼時許列我做錯了?

+4

您不想這樣做。這是'笛卡爾連接'不應該像'select * from t1,emp where t1.no = emp.empno' – Ben 2012-01-11 17:53:32

回答

5

假設t1表和emp表都具有視圖可以識別爲唯一的主鍵,我會猜測問題在於如何指定JOIN。你現在所擁有的看起來會創建一個笛卡兒積(每張表中的每行都不加區分地加入到每行中),這可能不會滿足保存鍵的表要求(在問題中引用你上面鏈接)。

您在FROM子句中指定隱式JOIN,但沒有看到任何JOIN條件(讀取:WHERE子句)。通過查看您的架構,我會假設你可以t1.no = emp.empno這樣JOIN:

create view v_t as 
select * 
from t1,emp 
where t1.no = emp.empno; 

或用明確的JOIN:

create view v_t as 
select * 
from t1 
inner join emp on emp.empno = t1.no; 

甲骨文將使一個NATURAL JOIN(沒有指定JOIN條件)在具有相同類型和名稱的列的表上。當然,因爲no和empno有不同的名字,所以這是行不通的。

既然你的CREATE VIEW是平方的,那麼讓我們來看INSERT。只要該表保存鍵並且不嘗試同時插入多個基表,您可以基於JOIN將INSERT插入到VIEW中。而你的情況意味着編寫兩個獨立的INSERT語句或觸發器,而不是寫的:

CREATE TRIGGER v_t_insteadof 
INSTEAD OF INSERT ON v_t 

FOR EACH ROW 
BEGIN 

INSERT INTO t1 (no, name) 
VALUES(:new.no, :new.name); 

INSERT INTO emp (empno, ename, job) 
VALUES(:new.no, :new.ename, :new.job); 

END v_t_insteadof; 

注意,你將需要調整INSERT INTO EMP基礎上,可能在該表中存在額外的字段。另外,您的INSERT命令需要專門命名字段:

INSERT INTO v_t (no, name, ename, job) VALUES (59, 'Bob', 'Bobs Ename', 'Bobs Job'); 
+0

好吧我已經做了更改,但仍然無法插入值 – Android 2012-01-12 02:53:29

+0

我越來越不能通過連接視圖修改多個基表 – Android 2012-01-12 02:54:23

+0

@Pragna我已根據您的新錯誤消息進行編輯。 – Aaron 2012-01-12 03:41:05

相關問題