如何在Oracle中创建表?建表报ORA-00903无效表名错误怎么解决
ORA-00903报错原因及Oracle正确建表方案
报错核心原因
user是Oracle内置的系统保留字,不能直接用作普通表名,这是触发ORA-00903: invalid table name报错的直接原因。- 除此之外你的SQL还存在多处Oracle语法不兼容问题,后续执行也会报错:
NOTNULL缺少空格,标准语法为NOT NULL- Oracle没有
AUTO_INCREMENT关键字,自增列需要用特殊逻辑实现 - Oracle场景下更推荐使用
VARCHAR2替代VARCHAR,前者是Oracle官方定义的可变长字符串标准类型
正确建表方案
方案1:更换非保留字作为表名(最推荐)
适用Oracle 12c及以上版本
可直接使用IDENTITY属性实现自增:
CREATE TABLE users (id INT NOT NULL GENERATED ALWAYS AS IDENTITY, name VARCHAR2(45) NOT NULL, email VARCHAR2(45) NOT NULL, password VARCHAR2(45) NOT NULL, PRIMARY KEY(id));
适用Oracle 11g及更低版本
需要先创建序列,再搭配表使用,如需自动赋值可新增触发器:
- 创建自增序列
CREATE SEQUENCE users_id_seq START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE;
- 创建数据表
CREATE TABLE users (id INT NOT NULL, name VARCHAR2(45) NOT NULL, email VARCHAR2(45) NOT NULL, password VARCHAR2(45) NOT NULL, PRIMARY KEY(id));
- 新增触发器实现插入时自动赋值ID(可选)
CREATE OR REPLACE TRIGGER users_id_trg BEFORE INSERT ON users FOR EACH ROW BEGIN :new.id := users_id_seq.NEXTVAL; END; /
方案2:强制使用user作为表名(非常不推荐)
如果实在需要用user作为表名,可以用双引号包裹保留字实现,但后续所有对该表的操作都必须用双引号包裹表名,否则仍会报错:
-- 仅做演示,不建议生产环境使用 CREATE TABLE "user" (id INT NOT NULL GENERATED ALWAYS AS IDENTITY, name VARCHAR2(45) NOT NULL, email VARCHAR2(45) NOT NULL, password VARCHAR2(45) NOT NULL, PRIMARY KEY(id));
注意:双引号包裹的表名会严格区分大小写,如果建表时写的是小写
"user",查询时写"USER"也会触发表不存在的报错。
内容的提问来源于stack exchange,提问作者Shiv Kumar Shah
相关产品推荐
相关产品推荐

