2012-01-11 4 views
6

ho t1 tavolo avendo no number(3) e name varchar2(20) colonnenon può modificare una colonna che mappa di un errore di tavolo non a chiave conservata durante il tentativo di inserire in una visione

E emp tavolo avendo empno, ename, job ecc colonne.

Ora sono creatng vista

create view v_t as select * from t1,emp; 

Crea vista. Poi sto cercando di inserire i valori all'interno v_t che è vista ma mi dà errore che

non può modificare una colonna che mappa ad un tavolo non chiave-conservata

here is one link

Cosa am Sto sbagliando?

+4

Non si desidera eseguire questa operazione. È un 'join cartesiano' non dovrebbe essere qualcosa come 'select * da t1, emp dove t1.no = emp.empno' – Ben

risposta

5

Supponendo che sia la tabella t1 che la tabella emp abbiano chiavi primarie che la vista può identificare come uniche, ho intenzione di indovinare che il problema riguarda il modo in cui si specifica il proprio JOIN. Quello che hai ora sembra che creerà un prodotto cartesiano (ogni riga di una tabella unita indiscriminatamente a ogni riga dell'altro), e che probabilmente non soddisferà i requisiti della tabella preservata dalla chiave (a cui si fa riferimento nella domanda hai linkato sopra).

Si sta specificando un JOIN implicito nella clausola FROM, ma non vedo alcuna condizione JOIN (leggi: clausola WHERE). Osservando lo schema, ho intenzione di pensare che si può aderire sul t1.no = emp.empno come questo:

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

o con un esplicito registrazione:

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

Oracle permetterà un NATURAL JOIN (senza specificare condizioni JOIN) su tabelle che hanno colonne dello stesso tipo e nome. Certo, dal momento che no e empno hanno nomi diversi, non funzionerà.

Ora che la tua CREATE VIEW è al quadrato, andiamo all'INSERTO. Puoi INSERIRE in una VISTA basata su un JOIN purché la tabella sia conservata con la chiave e non provi a INSERIRE su più di una tabella base in una volta. Che nel tuo caso significa scrivere due istruzioni INSERT separati o la scrittura di un trigger 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; 

Nota, che è necessario regolare l'INSERT INTO emp basata sui campi aggiuntivi che potrebbero esistere in tale tabella. Inoltre, il comando INSERT dovrà denominare i campi in modo specifico:

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

ok ho apportato tali modifiche ma non riesco ancora a inserire valori – Android

+0

sto diventando impossibile modificare più di una tabella di base attraverso una vista join – Android

+0

@Pragna Ho effettuato una modifica in base al nuovo messaggio di errore. – Aaron

Problemi correlati