MySQL迁移Oracle建表遇ORA-00907:缺失右括号错误求助
解决Oracle建表时的ORA-00907错误:MySQL到Oracle的语法差异调整
嘿,这个ORA-00907错误其实是因为你直接把MySQL的建表语句搬到Oracle里用了,两种数据库的语法有不少差异,我帮你把问题点拆解清楚,再给你修正后的语句:
几个关键的语法差异问题
- 整数类型写法:Oracle不支持
int(11)这种带括号长度的整数定义,直接用INT就可以;如果需要限制数值精度,也可以用NUMBER(11)。 - 自增字段实现:MySQL的
AUTO_INCREMENT在Oracle里是无效语法。Oracle 12c及以上版本可以用GENERATED AS IDENTITY直接实现自增;如果是11g及以下的旧版本,需要手动创建序列和触发器来实现。 - 默认值类型匹配:
quantity int(11) DEFAULT '1'这里把字符串'1'作为整数类型的默认值,Oracle会报错,要改成数字DEFAULT 1。
修正后的建表语句
情况1:Oracle 12c及以上版本(推荐)
直接用GENERATED AS IDENTITY实现自增,语法更简洁:
CREATE TABLE menu ( id INT GENERATED ALWAYS AS IDENTITY NOT NULL, restaurant_id VARCHAR(30) DEFAULT NULL, menu_name VARCHAR(30) DEFAULT NULL, menu_description VARCHAR(500) DEFAULT NULL, menu_price VARCHAR(30) DEFAULT NULL, quantity INT DEFAULT 1, PRIMARY KEY (id) );
情况2:Oracle 11g及以下版本
需要先创建序列,再建表,最后用触发器绑定自增逻辑:
-- 第一步:创建自增序列 CREATE SEQUENCE menu_seq START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE; -- 第二步:创建表 CREATE TABLE menu ( id INT NOT NULL, restaurant_id VARCHAR(30) DEFAULT NULL, menu_name VARCHAR(30) DEFAULT NULL, menu_description VARCHAR(500) DEFAULT NULL, menu_price VARCHAR(30) DEFAULT NULL, quantity INT DEFAULT 1, PRIMARY KEY (id) ); -- 第三步:创建触发器,插入时自动填充id CREATE OR REPLACE TRIGGER menu_trg BEFORE INSERT ON menu FOR EACH ROW BEGIN SELECT menu_seq.NEXTVAL INTO :NEW.id FROM DUAL; END; /
补充说明
Oracle的错误提示有时候会有点“误导性”,比如这里的“missing right parenthesis”,其实本质是它不认识MySQL特有的语法,导致解析失败。调整完上面这些差异点,你的建表语句就能正常执行啦。
内容的提问来源于stack exchange,提问作者Martaer
相关产品推荐
相关产品推荐

