[英]Cannot modify a column which maps to a non key-preserved table error while trying to insert into a view
我有t1
表no number(3)
和name varchar2(20)
列
並且emp
表有empno
, ename
, job
等列。
現在我創造了一個觀點
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.