【问题标题】:How to insert into a view of joins?如何插入连接视图?
【发布时间】:2017-05-14 11:23:31
【问题描述】:

我正在尝试在包含两个表中的列的视图中插入一些数据。 问题是我收到错误:

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)分别创建了两个插入。我也尝试删除A.id_formatie,但没有成功。

感谢任何帮助!谢谢。

【问题讨论】:

标签: sql oracle


【解决方案1】:

是的,你是对的。您不能将记录插入复杂视图(意味着选择带有连接的查询)。但是您可以通过在视图上创建触发器的 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);

希望我回答了你的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多