【发布时间】:2020-10-13 14:29:39
【问题描述】:
我有一个表 imp 描述为 imp(ID, col1, col2, col3) 和第二个表 soc (ID, colSoc1, colSoc2, colSoc3)。 ColSoc3 是另一个表的外键。
我已经实现了以下合并两个表的请求:
MERGE INTO soc tb
USING (
SELECT ID,
col1,
col2,
CASE
WHEN col3= NULL THEN
NULL
ELSE
col3
END AS col3
from imp ) req on ( tb.ID=req.ID)
when matched then
update set tb.colSoc1=req.col1, tb.colSoc2=req.col2, tb.colSoc3=req.col3
when not matched then
insert (ID, colSoc1, colSoc2, colSoc3)
values (req.ID, req.col1, req.col2, req.col3);
我遇到的问题是当 col3 值为 NULL 时,soc 表中没有插入任何内容。
如何强制将col3 插入Colsoc3,即使它具有空值?
soc 的 ddl 如下:
CREATE TABLE "OWNER"."soc"
(
"ID" VARCHAR2(17 CHAR) NOT NULL ENABLE,
"socCol1" VARCHAR2(17 CHAR),
"socCol2" VARCHAR2(17 CHAR),
"socCol3" VARCHAR2(17 CHAR),
CONSTRAINT "Soc_PK" PRIMARY KEY ("ID")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "DATA0001" ENABLE,
CONSTRAINT "Soc_FK1" FOREIGN KEY ("socCol3")
REFERENCES "OWNER"."socParent" ("ID_parent") ENABLE
) SEGMENT CREATION IMMEDIATE
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
NOCOMPRESS NOLOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "DATA0001" ;
让我认为空外键的问题是我尝试不插入 col3 并且它起作用了,然后我使用下面的请求查看未找到父键的行是什么,结果都具有空值对于 col3
select * from imp where col3 not in ( select ID_parent from socParent);
提前致谢。
【问题讨论】:
-
WHEN col3= NULL THEN永远不会是真的;也许您的意思是WHEN col3 IS NULL THEN,但那个 case 表达式的意义何在? -
您的 CASE 陈述是错误的。 NULL 从不等于任何东西,你应该测试
when col3 is null。除了你只分配 NULL ,那有什么意义呢?这流入了您的实际问题:即使 col3 具有空值,如何强制将 col3 插入 Colsoc3?如果 COL3 为空,则无需分配任何内容。您的意思是要应用默认值吗?如果您为 IMP 和 SOC 提供一些示例行,并向我们展示您希望从合并中获得什么结果,将会有所帮助。 -
@AlexPoole 我使用 WHEN col3= NULL THEN 来避免异常,因为它是外键
-
请edit your question添加DDL和示例数据。但是为什么您认为 null 值导致了父键错误,而不是
imp表中的其他col3值之一?您是否验证了所有非空值确实存在? Foreign keys can be null.