【问题标题】:insert a null value in a foreign key column using a merge statement oracle使用合并语句 oracle 在外键列中插入空值
【发布时间】: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 来避免异常,因为它是外键
  • 如果你得到了一个没有 case 表达式的异常,那么你仍然会用 case 表达式得到它,因为它没有做任何有用的事情。但是您没有显示异常-这就是您所说的“没有插入任何内容”吗?你所展示的works,所以有些东西不见了。请将表格 DDL 和示例数据添加到您的问题中(请查看 edit)。
  • edit your question添加DDL和示例数据。但是为什么您认为 null 值导致了父键错误,而不是 imp 表中的其他 col3 值之一?您是否验证了所有非空值确实存在? Foreign keys can be null.

标签: sql oracle merge


【解决方案1】:

我试过了:WHEN col3 = 'null' 而不是 WHEN col3 is NULL 并且有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 2017-07-27
    相关资源
    最近更新 更多