【问题标题】:Oracle: Insert default value 0 into timestamp columnOracle:将默认值 0 插入时间戳列
【发布时间】:2017-01-08 04:52:07
【问题描述】:

是否可以在 oracle timestamp(6) 列中插入默认值 0?

我有一列CS_Date_Time 定义为Timestamp(6) NOT NULL。在某些情况下,向该列插入任何值都是无效的。因此,在这些情况下,我没有更改定义以允许 NULL 值并将此列保留为 NULL,而是在寻找任何替代方案。

【问题讨论】:

  • 没有。 0 是一个数字,而不是时间戳。您要解决什么业务问题?
  • 我有一列“CS_Date_Time”定义为 Timestamp(6) NOT NULL。在某些情况下,向该列插入任何值是无效的,因此在这些情况下,我没有更改定义以允许 NULL 值并将该列保留为 null,而是在寻找任何替代方案。
  • 类似 1960 年 1 月 1 日 00:00:00?但是,为什么不允许空值?这似乎是标准解决方案。
  • 是的,我认为最好的解决方案是允许该列使用空值。非常感谢您的 cmets。
  • 当这样的列用于 RANGE PARTITION 时,至少有一个用例——甚至不是一个奇特的案例

标签: sql oracle oracle11g


【解决方案1】:

0 是一个数字,而不是时间戳。您可以使用明显超出业务规则的日期,例如 0000-01-01 00:00:00 或 1900-01-01 00:00:00 或 2999-12-31 23:59:59

当然,它应该只是整个应用程序的一个特殊值,这些值只是示例。

例子:

CREATE TABLE T
(
  END_TIME TIMESTAMP(6) DEFAULT TIMESTAMP '9999-12-31 23:59:59' NOT NULL,
...
);

【讨论】:

  • @wennfried Domscheit:对于使用有效值来表示空值,我很害羞(紧张、焦虑)。虽然您可能会记录类似这样的事情,但当有人试图使用数据并且不知道特殊含义值时,它会导致问题。例如,假设这是一个出生日期,而您想找出大多数人是在哪个月份出生的。在不知道“NULL”值的情况下,您的答案可能是 1 月或 12 月,具体取决于您选择的值。而且您将始终围绕该值进行编码,其中 NULL 更易于处理。
  • @BrianLeach 当然,使用 NULL 值要简单得多,显然是首选设计。但是,您可能会遇到无法使用 NULL 值的情况(例如 RANGE 分区)。当然,您必须在整个应用程序中正确处理此类特殊值,这需要额外的编码工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-31
  • 1970-01-01
  • 2020-11-06
  • 1970-01-01
相关资源
最近更新 更多