【问题标题】:updating create view - error ORA-01779:更新创建视图 - 错误 ORA-01779:
【发布时间】:2013-12-04 04:35:43
【问题描述】:

我已经使用 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) 
);

【问题讨论】:

标签: oracle oracle11g


【解决方案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 的效果如何。

【讨论】:

  • 我实施了您建议的更改,但仍然会产生错误。对于 r.customerNo = c.customerNo,这是仅有的两个具有 customerNo 列的表。
  • 我现在看到了这个问题,以下连接对于 r 来说不是唯一的:INNER JOIN rental r ON i.itemNo = r.itemNo
  • 我应该改变什么?
  • 好吧,你想做什么?我认为您的更新查询的逻辑可能是 FUBAR:它将April AlisterKingsway 租用的所有项目的项目编号更新为3
  • 这是一个家庭作业,问题的说明是“更新视图RentalInfoOct,将April Alister 10 月28 日从Kingsway 分店的租金改为第3 项。”
猜你喜欢
  • 1970-01-01
  • 2019-01-30
  • 2021-05-10
  • 2016-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-12
  • 1970-01-01
相关资源
最近更新 更多