Sql 使用函数中使用主键列的默认值创建表

Sql 使用函数中使用主键列的默认值创建表,sql,oracle,oracle11g,ddl,Sql,Oracle,Oracle11g,Ddl,我只是涉猎了一下甲骨文,所以如果这是基本的,请对我放松点……我已经广泛地搜索了一个答案,但答案不存在,这是不可能的,或者我的搜索没有使用正确的术语 无论如何,我正在编写DDL,它将创建一个日期维度表。我有一个日期键,它是表的主键,我试图将它传播到表中的所有其他列,以便在向日期键列添加新值时用作这些列的默认值 以下是我到目前为止尝试过的一个片段,但给出了错误“ORA-00984:此处不允许列”: 如果用SYSDATE替换DATE\u键,则不会返回任何错误。但是,假设我概念化的所有内容都实现了,我需

我只是涉猎了一下甲骨文,所以如果这是基本的,请对我放松点……我已经广泛地搜索了一个答案,但答案不存在,这是不可能的,或者我的搜索没有使用正确的术语

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

以下是我到目前为止尝试过的一个片段,但给出了错误“ORA-00984:此处不允许列”:

如果用
SYSDATE
替换
DATE\u键
,则不会返回任何错误。但是,假设我概念化的所有内容都实现了,我需要插入一个比sysdate更具体的日期……为了清楚起见,没有其他列可以更新

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


感谢您的帮助。

您可以使用虚拟列来实现类似的功能。这些是根据定义列的表达式动态计算的:

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\u Name
    ,说它至少应该是
    VARCHAR2(75)
  • 我使用这个函数来获取日数,因为我认为它更具描述性;你应该用你最舒服的东西
  • 我将格式字符串
    FMDay
    用于
    Day\u Name
    ,因为
    Day
    格式代码返回的字符串是最长的日名称(英语中的星期三)的长度,所以所有其他日名称后面都有空格。
    FM
    格式代码做了很多有用的事情,其中之一就是修剪尾随空格

我认为这不会起作用,但您可能可以使用触发器或使用表的包api来完成上述操作。你能再解释一下你以后打算怎么处理这张桌子吗?如果day_number和day_name列永远不会改变date_key列中的等价项,那么我真的不认为有必要使用它们。
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'))
)