gpt4 book ai didi

sql - 尝试插入 View 时无法修改映射到非键保留表错误的列

转载 作者:行者123 更新时间:2023-12-04 15:14:41 25 4
gpt4 key购买 nike

我有 t1表有 no number(3)name varchar2(20)

emp表有 empno , ename , job等列。

现在我正在创建一个 View

create view v_t as select * from t1,emp;

它创建 View 。然后我试图在 v_t 中插入值那是观点,但它给了我错误

cannot modify a column which maps to a non key-preserved table



here is one link

我究竟做错了什么?

最佳答案

假设 t1 表和 emp 表都具有 View 可以识别为唯一的主键,我猜测问题在于您如何指定 JOIN。您现在所拥有的看起来会创建一个笛卡尔积(一个表中的每一行不加选择地连接到另一个表中的每一行),这可能无法满足保留键的表要求(在问题中引用你在上面链接)。

您在 FROM 子句中指定了隐式 JOIN,但我没有看到任何 JOIN 条件(阅读:WHERE 子句)。通过查看您的架构,我将假设您可以像这样在 t1.no = emp.empno 上加入:

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

或者使用显式 JOIN:
create view v_t as
select *
from t1
inner join emp on emp.empno = t1.no;

Oracle 将允许对具有相同类型和名称的列的表进行 NATURAL JOIN(不指定 JOIN 条件)。当然,由于 no 和 empno 具有不同的名称,所以这是行不通的。

既然您的 CREATE VIEW 已经平方,让我们进入 INSERT。只要表是键保留的,您就可以基于 JOIN 插入到 VIEW 中,并且您不要尝试一次插入多个基表。在您的情况下,这意味着编写两个单独的 INSERT 语句或编写一个 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;

请注意,您需要根据该表中可能存在的其他字段来调整 INSERT INTO emp。此外,您的 INSERT 命令将需要专门命名字段:
INSERT INTO v_t (no, name, ename, job) VALUES (59, 'Bob', 'Bobs Ename', 'Bobs Job');

关于sql - 尝试插入 View 时无法修改映射到非键保留表错误的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8824015/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com