SQL 无效标识符 00904.00000 - “%s:无效标识符”

Posted

技术标签:

【中文标题】SQL 无效标识符 00904.00000 - “%s:无效标识符”【英文标题】:SQL invalid identifier 00904. 00000 - "%s: invalid identifier" 【发布时间】:2020-10-06 18:03:06 【问题描述】:

日历

CREATE TABLE CALENDAR
(
    CalendarKey int NOT NULL PRIMARY KEY,
    Date DATE DEFAULT (SYSDATE), 
    DayofWeek VARCHAR2(50) NOT NULL, 
    DayofMonth VARCHAR2(50) NOT NULL,
    DayofYear VARCHAR2(50) NOT NULL,
    WeekofMonth VARCHAR2(50) NOT NULL,
    WeekofYear VARCHAR2(50) NOT NULL,
    Month MONTH DEFAULT (SYSMONTH),
    Year YEAR DEFAULT (SYSYEAR)
);

此代码导致错误:

错误报告 - ORA-00904: : 标识符无效 00904. 00000 - “%s:无效标识符” *原因: *行动:

没有发现任何错误,请帮忙。

【问题讨论】:

Oracle 中没有sysmonthsysyear。 in the manual 你在哪里找到的? 除了其他 cmets,为什么要为“月”和“年”分开列?这肯定会导致问题。只需使用 DATE 类型的单个列。如果您只关心月份和年份,则可以在查询列时只使用 TRUNC 来忽略 DATE 的日期和时间部分。 【参考方案1】:
SQL> create table calendar
  2    (calendarkey int constraint pk_cal primary key,
  3     datum       date default (sysdate),
  4     dayofweek   varchar2(50) not null,
  5     dayofmonth  varchar2(50) not null,
  6     dayofyear   varchar2(50) not null,
  7     weekofmonth varchar2(50) not null,
  8     weekofyear  varchar2(50) not null,
  9     month       number(2) default extract (month from sysdate),
 10     year        number(4) default extract (year  from sysdate)
 11  );

Table created.

SQL>

那么,你做错了什么(连同附加说明):

您不能命名列 date,因为它是为数据类型名称保留的(实际上,您可以,但您不应该 - 将其名称包含在双引号) 主键意味着该列不能包含 NULL 值,因此 - 无需指定 NOT NULL。此外,命名所有约束是一个好习惯 Oracle 中没有 sysmonthsysyear,但是 - 如果我没记错的话 - 您可以使用 sysdate 并从中提取这些值(月份和年份) 您真的需要 50 个字符来存储天和周吗?不是按列大小向您收费,而是……哪一天最多占用 50 个字符?

【讨论】:

感谢您提供的信息和知识,公平地说,没有几天或几周需要 50 个字符。只是认为拥有更多总比拥有更少更好,因为不会计算处理能力,改变这种心态可能是件好事。

以上是关于SQL 无效标识符 00904.00000 - “%s:无效标识符”的主要内容,如果未能解决你的问题,请参考以下文章

Sql 错误 00904. 00000 - “%s: 无效标识符”

SQL 错误 ORA-00904:标识符无效

SQL 错误:ORA-00904:“GENDER”:无效标识符 00904。00000 -“%s:无效标识符”

错误报告:SQL 错误:ORA-00904::无效标识符 00904。00000 - “%s:无效标识符”

Oracle,无效标识符错误

ORA-00904: 无效标识符 00904. 00000 - "%s: 无效标识符"