更新创建视图 - 错误ORA-01779:

时间:2013-12-04 04:35:44

标签: oracle oracle11g

我使用CREATE VIEW命令创建一个视图(显然),并连接多个表。 CREATE VIEW命令工作正常,但是当我尝试更新VIEW RentalInfoOct时,收到错误“ORA-01779:无法修改映射到非密钥保留表的列”

CREATE VIEW RentalInfoOct
(branch_no, branch_name, customer_no, customer_name, item_no, rental_date)
AS
SELECT i.branchNo, b.branchName, r.customerNo, c.customerName, i.itemNo, r.dateFrom
FROM item i
INNER JOIN rental r
ON i.itemNo = r.itemNo
INNER JOIN branch b
ON i.branchNo = b.branchNo
INNER JOIN customer c
ON r.customerNo = c.customerNo
WHERE r.dateFrom 
BETWEEN to_date('10-01-2009','MM-DD-YYYY')
AND to_date('10-31-2009','MM-DD-YYYY')

我的更新命令。

UPDATE RentalInfoOct
SET item_no = '3'
WHERE customer_name = 'April Alister'
AND branch_name = 'Kingsway'
AND rental_date = '10/28/2009'

我不确定这是否有助于解决问题,但这是我的CREATE TABLE命令

CREATE TABLE Branch
(
    branchNo    SMALLINT    NOT NULL,
    branchName  VARCHAR(20) NOT NULL,
    branchAddress   VARCHAR(40) NOT NULL,
    PRIMARY KEY (BranchNo)
);

--Item Table Definition
CREATE TABLE Item
(
    branchNo    SMALLINT    NOT NULL,
    itemNo      SMALLINT    NOT NULL,
    itemSize    VARCHAR(8)  NOT NULL,
    price       DECIMAL(6,2)    NOT NULL,
    PRIMARY KEY (ItemNo, BranchNo),
    FOREIGN KEY (BranchNo) REFERENCES Branch ON DELETE CASCADE,
        CONSTRAINT VALIDAMT
       CHECK (price > 0)
);

-- Customer Table Definition
CREATE TABLE Customer
(
    customerNo      SMALLINT    NOT NULL,
    customerName        VARCHAR(15) NOT NULL,
    customerAddress     VARCHAR(40) NOT NULL,
    customerTel         VARCHAR(10),
    PRIMARY KEY (CustomerNo)
);

-- Rental Table Definition
CREATE TABLE Rental
(
    branchNo    SMALLINT    NOT NULL,
    customerNo  SMALLINT    NOT NULL,
    dateFrom    DATE        NOT NULL,
    dateTo      DATE,
    itemNo      SMALLINT    NOT NULL,
    PRIMARY KEY (BranchNo, CustomerNo, dateFrom),
    FOREIGN KEY (BranchNo) REFERENCES Branch(BranchNo) ON DELETE CASCADE,
    FOREIGN KEY (CustomerNo) REFERENCES Customer(CustomerNo) ON DELETE CASCADE,
        CONSTRAINT CORRECTDATES CHECK (dateTo > dateFrom OR dateTo IS NULL) 
);

1 个答案:

答案 0 :(得分:1)

请参阅:Oracle: multiple table updates => ORA-01779: cannot modify a column which maps to a non key-preserved table

您正在尝试使用连接更新视图,但连接条件不基于唯一性约束,这会创建从一个表中的单个行创建的多个行的可能性。

您的连接条件所基于的列之间似乎需要一个唯一键 - 外键关系。

编辑:我刚看到你的编辑。将r.branchNo = b.branchNo更改为i.branchNo = b.branchNo应该会有很长的路要走。不确定r.customerNo = c.customerNo的效果如何。