【问题标题】:Create a table with default values that use the primary key column in a function使用函数中的主键列创建具有默认值的表
【发布时间】:2013-06-21 14:05:10
【问题描述】:

我只是涉足 Oracle,所以如果这是基本的,请放轻松...我已经广泛搜索了答案,但答案不存在,这是不可能的,或者我的搜索没有使用正确的术语。

无论如何,我正在编写将创建日期维度表的 DDL。我有一个日期键,它是表的主键,我试图将它传播到表中的所有其他列,以在将新值添加到日期时用作这些列的默认值键列。

这是我迄今为止尝试过的一个 sn-p,但给了我错误“ORA-00984: column not allowed here”:

CREATE TABLE DATE_DIM
(
    DATE_KEY  DATE NOT NULL,
        CONSTRAINT DATE_KEY_PK PRIMARY KEY (DATE_KEY),
    DAY_NUMBER  NUMBER(2) DEFAULT TO_NUMBER(TO_CHAR(DATE_KEY,'DD')),
    DAY_NAME  VARCHAR(36) DEFAULT TO_CHAR(DATE_KEY,'Day')
)

如果我用SYSDATE 替换DATE_KEY,我不会返回任何错误。但是,假设我正在构思的所有内容都实现了,我将需要插入一个比 sysdate 更具体的日期......为了清楚起见,没有其他列可以更新。

最终,这个想法将扩展到包含具有不同类型数据的其他表,所以如果您想知道为什么我不使用脚本、Excel 等创建一个充满日期的大表,我理解。我只是认为日期维度提供了一个很好的例子来解释我想要实现的目标。

感谢您的帮助。

【问题讨论】:

  • 我认为这行不通,但您可能可以使用触发器或使用表的包 api 来完成上述操作。你能多解释一下你打算用这张桌子做什么吗?如果 day_number 和 day_name 列永远不会与 date_key 列中的等价列发生变化,那么我根本不认为需要它们。

标签: sql oracle oracle11g ddl


【解决方案1】:

您可以将虚拟列用于此类操作。这些是根据定义列的表达式动态计算的:

CREATE TABLE date_dim (
  Date_Key DATE NOT NULL,
  Day_Number AS (EXTRACT(DAY FROM Date_Key)),
  Day_Name AS (TO_CHAR(Date_Key, 'FMDay'))
)

一些注意事项:

  • 我通常发现不指定虚拟列的类型更容易。你可以,但经常会发生一些奇怪的事情。你的表也不例外:Oracle 抱怨 VARCHAR2(36)Day_Name,说它至少应该是 VARCHAR2(75)
  • 我使用EXTRACT 函数来获取天数,因为我认为它更能说明这一点;你应该使用你最喜欢的任何东西。
  • 我使用格式字符串FMDay 表示Day_Name,因为Day 格式代码返回一个字符串,该字符串是最长日期名称(英文为星期三)的长度,因此所有其他日期名称都将有尾随空格。 FM 格式代码做了很多有用的事情,其中​​之一就是修剪尾随空格。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多