【问题标题】:I tried to run this but I get an error "ORA-00904: : invalid identifier" [duplicate]我试图运行它,但出现错误“ORA-00904: : invalid identifier” [重复]
【发布时间】:2022-01-04 14:32:12
【问题描述】:

错误发生在这里:

CREATE TABLE CERDIT_CARD_LOG
(
    CERDIT_CARD_NUMBER     CHAR(20) NOT NULL,
    CERDIT_CARD_LOG_NUMBER CHAR(15) NOT NULL,
    CERDIT_CARD_NUM        CHAR(20) NOT NULL,
    DATE                   DATE     NOT NULL,
    OPERATION_TYPE         CHAR(20) NOT NULL,

    CONSTRAINT PK_CERDIT_CARD_LOG 
        PRIMARY KEY (CERDIT_CARD_LOG_NUMBER, CERDIT_CARD_NUM)
);

ALTER TABLE CERDIT_CARD_LOG
    ADD CONSTRAINT FK_CERDIT_C_RECORD_CERDIT_C 
            FOREIGN KEY (CERDIT_CARD_NUMBER)
                    REFERENCES CERDIT_CARD (CERDIT_CARD_NUMBER);

【问题讨论】:

  • 外键必须引用整个键。在这种情况下,两列,而不仅仅是一列。
  • 这是一张信用卡 - 不是“cerdit 卡” ....
  • DATE 是保留字,en.wikipedia.org/wiki/SQL_reserved_words。要么选择别的东西,要么定界为"DATE"
  • 只需将其更改为CREDIT_CARD_DATE。同时搜索“CERDIT”并将其替换为“CREDIT”。
  • 如前所述,您应该将此日期称为不同的日期。这甚至可以澄清日期的内容。也许是卡的EXPIRATION_DATE?而且,顺便说一句,你永远不应该使用CHAR。这种数据类型在查询中使用起来很麻烦,在任何方面都比 VARCHAR2 没有优势。

标签: sql oracle


【解决方案1】:

如果你想在Oracle(保留字)中创建一个名称为DATE的列,你需要把它当作一个特殊的标识符,并用双引号括起来。

你可以这样做:

create table CERDIT_CARD_LOG
(
    CERDIT_CARD_NUMBER      CHAR(20)               not null,
    CERDIT_CARD_LOG_NUMBER  CHAR(15)               not null,
    CERDIT_CARD_NUM         CHAR(20)               not null,
    "DATE"                    DATE                   not null,
    OPERATION_TYPE          CHAR(20)               not null,
  constraint PK_CERDIT_CARD_LOG primary key (CERDIT_CARD_LOG_NUMBER,CERDIT_CARD_NUM  )
);

参见db<>fiddle 的示例。

注意:如您所见,可以使用保留字。我个人避免使用它,因为我需要记住在我以后编写的每个查询中都用双引号将它们括起来。我通常更喜欢将其名称更改为 opened_on 或类似名称。

【讨论】:

    猜你喜欢
    • 2015-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多