运行Oracle建表SQL时报错ORA-00904无效标识符问题求助
ORA-00904报错原因及解决方案
报错根因
- 核心问题是你在
CREATE TABLE语句中使用了Oracle数据库的**保留关键字DATE**作为字段名,保留关键字不允许直接用作标识符(表名、字段名等),因此触发ORA-00904无效标识符报错。
解决方法
方案1:更换字段名(最推荐,避免后续各类兼容问题)
把DATE字段替换为非保留关键字的业务相关名称,比如OPERATION_DATE、TRANS_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, OPERATION_DATE DATE NOT NULL, -- 替换原DATE字段 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);
方案2:强制使用关键字作为字段名(不推荐,仅适配特殊场景)
如果业务要求必须使用DATE作为字段名,可以用双引号包裹该字段名。注意Oracle中双引号包裹的标识符是大小写敏感的,后续所有查询、修改操作引用该字段时都必须加双引号且保持大小写一致,示例:
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) );
后续引用该字段的示例:
SELECT "DATE" FROM CERDIT_CARD_LOG WHERE "DATE" > DATE'2024-01-01';
内容的提问来源于stack exchange,提问作者iMaiclove
相关产品推荐
相关产品推荐

