一次做农行的项目,在向一个表插入数据时我们要求插入字符类型的操作日期和时间,我们这边当时采取的是给日期和时间字段设置默认值的方法:下面我简单还原一下当时的表结构

-- Create table
create table TEST_DATE_TIME
(
  id           INTEGER,
  operdate     VARCHAR2(20) default "TO_CHAR"(SYSDATE,'yyyy-MM-dd'),
  operdatetime VARCHAR2(20) default "TO_CHAR"(SYSDATE,'yyyy-MM-dd HH24:MI:SS')
)

PLSQL截图:

oracle设置默认值无效_IT

当时我们使用的框架生成的插入语句是:

INSERT INTO TEST_DATE_TIME (ID,OPERDATE,OPERDATETIME)VALUES(0,null,null)

结果就造成默认值并没有生效:

oracle设置默认值无效_oracle设置默认值无效_02

后来查询资料才明白原因:

其实对于默认值,Oracle支持两种方式:
1. Default关键字
2. 不指定列
先看第一种方式:

INSERT INTO TEST_DATE_TIME (ID,OPERDATE,OPERDATETIME)VALUES(1,default,null)

oracle设置默认值无效_oracle设置默认值无效_03

再看第二种方式:

INSERT INTO TEST_DATE_TIME (ID)VALUES(2)

oracle设置默认值无效_oracle设置默认值无效_04

综上所述,Oracle的默认值处理要当心,如果项目应用中使用的是ORM工具,则必须要考虑对于字段为Null的处理,必要时在ORM工具中将Null转换为default或插入时去掉值为Null的字段。