插入null时插入默认值

SWi*_*ilk 11 oracle default notnull

我有一个Oracle数据库,以及一个包含多个非空列的表,所有这些都具有默认值.

我想对我要插入的任何数据使用一个insert语句,并且不用费心去检查插入的值是否为空.

插入null时是否有任何方法可以回退到默认列值?

我有这个代码:

<?php
if (!empty($values['not_null_column_with_default_value'])) {
    $insert = "
        INSERT INTO schema.my_table
            ( pk_column, other_column, not_null_column_with_default_value)
        VALUES
            (:pk_column,:other_column,:not_null_column_with_default_value)
     ";
} else {
    $insert = "
        INSERT INTO schema.my_table
            ( pk_column, other_column)
        VALUES
            (:pk_column,:other_column)
     ";        
}
Run Code Online (Sandbox Code Playgroud)

所以,我必须完全省略该列,否则我将错误"尝试将null插入非空列".当然我有多个可空列,所以代码创建插入语句是非常难以理解的,丑陋的,我只是不喜欢它.

我想有一个声明,类似于:

INSERT INTO schema.my_table
    ( pk_column, other_column, not_null_column_with_default_value)
VALUES
    (:pk_column,:other_column, NVL(:not_null_column_with_default_value, DEFAULT) );
Run Code Online (Sandbox Code Playgroud)

那当然是一个假设的查询.你知道我用Oracle DBMS实现这个目标的方式吗?

编辑:

谢谢大家的答案.它接触到没有"标准"的方式来实现我想要的,所以我接受了IMO的最佳答案:我应该停止聪明并坚持通过自动构建的语句省略空值.

不完全是我想看到的,但没有更好的选择.

小智 14

对于那些现在阅读它的人:

在Oracle 12c中有一个新功能:DEFAULT ON NULL.例如:

CREATE TABLE tab1 (
  col1        NUMBER DEFAULT 5,
  col2        NUMBER DEFAULT ON NULL 7,
  description VARCHAR2(30)
);
Run Code Online (Sandbox Code Playgroud)

因此,当您尝试在col2中INSERT null时,这将自动为7.