我是 Derby 的新手,我注意到我遇到了与使用 DB2 RDBMS 时类似的问题 null
值(value)观有关。 Derby 文档指出,null
value 必须有一个与之关联的类型(DB2 最终在 9.7 版中摆脱了这种类型):
http://db.apache.org/derby/docs/10.7/ref/crefsqlj21305.html
现在,我试图找到一个 一般在这里解决这个问题,因为这将是我的数据库抽象库的一部分 jOOQ .下面的例子只是记录了这个问题。想想任何其他(更复杂)的例子。以下不起作用:
insert into T_AUTHOR (
ID, FIRST_NAME, LAST_NAME,
DATE_OF_BIRTH, YEAR_OF_BIRTH, ADDRESS)
select
1000, 'Lukas', 'Eder',
'1981-07-10', null, null
from SYSIBM.SYSDUMMY1
这也不是(这是 jOOQ 实际完成的):
insert into T_AUTHOR (
ID, FIRST_NAME, LAST_NAME,
DATE_OF_BIRTH, YEAR_OF_BIRTH, ADDRESS)
select ?, ?, ?, ?, ?, ?
from SYSIBM.SYSDUMMY1
因为两个
null
值没有与之关联的类型。解决方案是这样写:insert into T_AUTHOR (
ID, FIRST_NAME, LAST_NAME,
DATE_OF_BIRTH, YEAR_OF_BIRTH, ADDRESS)
select
1000, 'Lukas', 'Eder',
'1981-07-10', cast(null as int), cast(null as varchar(500))
from SYSIBM.SYSDUMMY1
或者像这样,分别
insert into T_AUTHOR (
ID, FIRST_NAME, LAST_NAME,
DATE_OF_BIRTH, YEAR_OF_BIRTH, ADDRESS)
select
?, ?, ?, ?, cast(? as int), cast(? as varchar(500))
from SYSIBM.SYSDUMMY1
但很多时候,在 Java 中,
null
的类型应该被强制转换为未知:int
),但这在本示例中不起作用,因为您不能放置 cast(null as int)
值(value)成ADDRESS
. cast(null as object)
这在大多数情况下都有效。但是 Derby 没有 object
类型。 这个问题以前一直困扰着我使用 DB2,我还没有找到解决方案。有谁知道稳定 , 和 一般对于这些 RDBMS 中的任何一个,此问题的解决方案是什么?
最佳答案
如果在 INSERT 上使用 VALUES 子句,则不必强制转换 NULL 值:
insert into T_AUTHOR (
ID, FIRST_NAME, LAST_NAME,
DATE_OF_BIRTH, YEAR_OF_BIRTH, ADDRESS)
VALUES (
1000, 'Lukas', 'Eder',
'1981-07-10', null, null
);
这将像您期望的那样工作(即数据库可以确定 NULL 对应于一个整数和 varchar(500)。这在 DB2 和 Derby 中都有效(并且应该也可以在几乎所有其他数据库引擎中使用)。
您也可以将 VALUES 与参数标记一起使用,而不必对它们进行 CAST。
发出
insert into ... select from
时必须强制转换的原因语句是因为 SELECT 部分优先 - select 语句返回某些数据类型,无论它们是否与您尝试将它们插入的表兼容。如果它们不兼容,您将收到错误消息(对于 DB2 <= 9.5 等强类型数据库引擎),或者引擎将进行隐式类型转换(如果可能)。
关于sql - Derby 对 NULL 值的处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4905826/