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.