相关疑难解决方法(0)

Oracle - 更新连接 - 非密钥保留表

我正在尝试复制Ingres"从tbl2更新tbl1"命令,这在Oracle中并不完全存在.

所以我使用"update(select tbl1 join tbl2 ...)"命令.两个表都定义了主键,我认为我的连接是唯一标识行,但我仍然得到"ORA-01779:无法修改映射到非密钥保留表的列".

这里有适当的匿名表定义和我正在尝试执行的更新:

CREATE TABLE tbl1
(
   ID decimal(11) NOT NULL,
   A varchar2(3) NOT NULL,
   B float(7),
   CONSTRAINT tbl1_pk PRIMARY KEY (ID,A)
)
;

CREATE TABLE tbl2
(
   ID decimal(11) NOT NULL,
   A varchar2(3) NOT NULL,
   B float(15),
   C float(15),
   D char(1) NOT NULL,
   CONSTRAINT tbl2_PK PRIMARY KEY (ID,A,D)
)
;

UPDATE 
  (select tbl1.b, tbl2.c 
   from tbl1 inner join tbl2 
   on tbl1.id=tbl2.id 
   and tbl1.a=tbl2.a 
   and tbl1.b=tbl2.b 
   and tbl1.a='foo' 
   and tbl2.D='a') 
set b=c;
Run Code Online (Sandbox Code Playgroud)

如何定义我的选择,以便Oracle确信我没有唯一性违规?

oracle

12
推荐指数
1
解决办法
5万
查看次数

如何摆脱 ORA 01779 错误:密钥保留表

这是sql语句:

UPDATE 
(SELECT table1.nbqe as OLD_nbqe, table2.nbqe as NEW_nbqe,
  table1.adr1 as OLD_adr1, table2.adr1 as NEW_adr1
  table1.adr3 as OLD_adr3, table2.adr2 as NEW_adr3
 FROM table1
 INNER JOIN table2
 ON table1.cg= table2.cg AND table1.ce = table2.ce
) t
SET t.OLD_nbqe = t.NEW_nbqe, t.OLD_adr1 = t.NEW_adr1, t.OLD_adr3 = t.NEW_adr3
Run Code Online (Sandbox Code Playgroud)

这会发生 01779 错误:无法修改映射到非键保留表的列

如何修改sql语句来实现操作?

注意:这个问题不重复

table1 columns :
 nbqe
 adr1
 adr2
 adr3
 cg
 ce

table2 column :
 nbqe
 adr1
 adr2
 cg
 ce
Run Code Online (Sandbox Code Playgroud)

在表2中,cg + ce是单个键

在表 1 中,您可以拥有同一对 (cg、ce) 的多个记录。

这些表没有任何约束,甚至没有主键或任何东西。


我会以不同的方式问它。sql语句可能是错误的。

更新中的选择返回表 1 …

sql oracle

3
推荐指数
1
解决办法
5234
查看次数

标签 统计

oracle ×2

sql ×1