【问题标题】:Oracle 11g - "DEFAULT ON NULL"?Oracle 11g - “默认为 NULL”?
【发布时间】:2016-12-25 21:23:57
【问题描述】:

我正在运行 Oracle 数据库 11g 企业版版本 11.2.0.4.0 - 64 位生产,我试图为一个表找到一个等效于 12c 的“DEFAULT ON NULL”。基本上,我必须创建一个表,其中的要求是,每当有人有意或无意地传递一个 NULL 值时,它就会被一个 DEFAULT 值替换(在这种情况下,一个 NUMBER 类型等于 1)。在 11g 中是否有任何简单的方法可以做到这一点?我知道我可以在表格上做一个触发器,但我必须为每一列输入逻辑,这似乎很荒谬。

我的表定义目前如下所示:

CREATE TABLE MYTABLE
(
    FLAG   NUMBER(1)   DEFAULT 0
)

如果我明确传入 null,它将被存储。在那种情况下,我希望改为放置默认值。

【问题讨论】:

  • Null 是一个完全有效的值。默认是未提供值时。你可以写一个“插入前”触发器吗?
  • 在 11g 中,恐怕没有原生的方法来完成它。如果您不想使用触发器,则可以创建一个视图。无论哪种方式,您都必须为每一列编写一些逻辑,就像为每一列编写 default on null 一样,只是它会更长一点。
  • 我绝对可以做到。实际上我已经这样做了,我正在做 COALESCE(:new.FLAG, 0) 并且这似乎有效,但我想知道 11g 中是否有更优雅的解决方案。如此简单的事情竟然变得如此复杂,这似乎很奇怪。
  • “如此简单的事情竟然变得如此复杂,这似乎很奇怪。”欢迎来到甲骨文

标签: oracle oracle11g null default default-value


【解决方案1】:

您可以对列使用简单的“默认”行为,并且在插入时不提供任何内容。

CREATE TABLE table1 (
id NUMBER(8.0) NOT NULL,
col1 NUMBER(8.0) NOT NULL DEFAULT 10,
col2 NUMBER(8.0) NOT NULL DEFAULT 20,
PRIMARY KEY (id);
);

INSERT INTO table1 (id) values (123); //will result in creating a row with default values.

此外,如果您使用某种 ORM,您可以使用动态插入和动态更新选项。这样,如果您在插入时不提供值,它们将被设置为默认值; 并且在更新时,未更改的值将不会包含在查询中。

这是您可以绕过查询中的显式空值并应用默认值的方法。

【讨论】:

    猜你喜欢
    • 2010-10-18
    • 2018-08-28
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    • 2019-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多