簡體   English   中英

嘗試插入視圖時,無法修改映射到非密鑰保留表錯誤的列

[英]Cannot modify a column which maps to a non key-preserved table error while trying to insert into a view

我有t1no number(3)name varchar2(20)

並且emp表有empnoenamejob等列。

現在我創造了一個觀點

create view v_t as select * from t1,emp;

它創造了視圖。 然后我試圖在視圖中的v_t中插入值,但它給了我錯誤

無法修改映射到非密鑰保留表的列

這是一個鏈接

我究竟做錯了什么?

假設t1表和emp表都有主鍵,視圖可以識別為唯一,我猜測問題在於你如何指定你的JOIN。 你現在所擁有的東西看起來會創建一個笛卡爾積(從一個表中的每一行不加選擇地加入到另一個的每一行),這可能不會滿足密鑰保留表的要求(在問題中引用)你鏈接上面)。

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

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;

Oracle將允許對具有相同類型和名稱的列的表進行NATURAL JOIN(不指定JOIN條件)。 當然,因為沒有和empno有不同的名字,這是行不通的。

現在您的CREATE VIEW已經平方,讓我們進入INSERT。 只要表是密鑰保留的,您就可以基於JOIN插入到VIEW中,並且不會嘗試一次INSERT到多個基表。 在您的情況下,這意味着編寫兩個單獨的INSERT語句或編寫INSTEAD OF觸發器:

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 \\ temp。 此外,您的INSERT命令將需要專門命名字段:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM