2017-05-14 1 views
0

2つのテーブルの列を含むビュー内にデータを挿入しようとしています。 問題は、私は、エラーを受け取ることです:結合のビューに挿入する方法は?

SQL Error: ORA-01779: cannot modify a column which maps to a non key-preserved table 

これは私のコードです:

CREATE VIEW testvizualizare AS 
SELECT 
    F.id_formatie, F.nume nume_formatie, F.data_lansare, F.tara_prov, 
    A.data_l, A.gen, A.id_album, A.id_formatie id_formatie_album, A.nume nume_album, A.pret 
FROM 
    formatie F JOIN album A ON(F.id_formatie = A.id_formatie) 
    JOIN castiga C ON (C.id_formatie = A.id_formatie) 
    JOIN premiu P ON(P.id_premiu = C.id_premiu) 
WHERE 
    EXISTS(
     SELECT 
      1 
     FROM 
      formatie F1 JOIN album A1 ON(F1.id_formatie = A1.id_formatie) 
      JOIN castiga C1 ON (C1.id_formatie = A1.id_formatie) 
      JOIN premiu P1 ON(P1.id_premiu = C1.id_premiu) 
     WHERE 
      f1.id_formatie = F.id_formatie AND LOWER(a1.gen) = 'pop'); 

INSERT INTO testvizualizare 
VALUES(100, 'Atmosphere', (SELECT TO_DATE('01011996', 'DDMMYYYY') FROM DUAL), 'USA', (SELECT TO_DATE('06052014', 'DDMMYYYY') FROM DUAL), 'Hip-Hop', 999, 100, 'Southsiders', 15); 

私は問題が加入であることを推測します。私は各テーブル(FとA)ごとに2つの挿入を作成します。私もA.id_formatieを削除しようとしましたが、運がありません。

ヘルプが用意されています。ありがとう。

+1

http://stackoverflow.com/a/1653192/575376 –

答えて

0

はい、あなたは正しいです。複雑なビューにレコードを挿入することはできません(結合を含む選択クエリを意味します)。しかし、ビューにトリガーのINSTEADを作成してレコードを挿入することができます。

問題に対して以下のコードを使用できます。ただし、テーブルに挿入する場合は、必ずプライマリキーを挿入してください。

CREATE OR REPLACE TRIGGER tr_testvizualizare 
    INSTEAD OF INSERT ON testvizualizare 
    BEGIN 
     insert into formatie(id_formatie, nume nume_formatie, data_lansare, tara_prov) 
        values (:new.id_formatie,:new.nume nume_formatie,:new.data_lansare,:new.tara_prov); 
     insert into album(data_l, gen, id_album, id_formatie id_formatie_album, nume nume_album, pret) 
        values (new.data_l,:new.gen,:new.id_album,:new.id_formatie id_formatie_album,:new.nume nume_album,:new.pret) ; 

    END; 
/

ビューにトリガーを作成した後、私は私はあなたの質問に答えを期待

INSERT INTO testvizualizare 
       VALUES(100, 'Atmosphere', (SELECT TO_DATE('01011996', 'DDMMYYYY') FROM DUAL), 
         'USA', (SELECT TO_DATE('06052014', 'DDMMYYYY') FROM DUAL), 
         'Hip-Hop', 999, 100, 'Southsiders', 15); 

を挿入しよう。

関連する問題