一個專欄中,我有t1
有表no number(3)
和name varchar2(20)
列不能修改它映射到非鍵保存表的錯誤,而試圖插入一個視圖
而且emp
爲表empno
,ename
,job
等欄目。
現在我creatng視圖
create view v_t as select * from t1,emp;
它創建視圖。然後,我想裏面插入v_t
是鑑於值,但它給了我錯誤
不能修改映射到一個非關鍵保留的表
什麼時許列我做錯了?
一個專欄中,我有t1
有表no number(3)
和name varchar2(20)
列不能修改它映射到非鍵保存表的錯誤,而試圖插入一個視圖
而且emp
爲表empno
,ename
,job
等欄目。
現在我creatng視圖
create view v_t as select * from t1,emp;
它創建視圖。然後,我想裏面插入v_t
是鑑於值,但它給了我錯誤
不能修改映射到一個非關鍵保留的表
什麼時許列我做錯了?
假設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');
您不想這樣做。這是'笛卡爾連接'不應該像'select * from t1,emp where t1.no = emp.empno' – Ben 2012-01-11 17:53:32