Navicat 导出 Oracle Sequence 时需同时满足三项设置:导出格式选 SQL 文件、导出模式选 DDL only 或 DDL + Data、Oracle 兼容性设为 Oracle;否则即使勾选“序列”也不会生成 CREATE SEQUENCE 语句。
Navicat 导出 Oracle Sequence 时勾选了“序列”却没导出?
不是 navicat 不支持,而是 oracle 的 sequence 对象在 navicat 中默认不生成 create sequence 语句——它只导出元数据(如序列名、当前值),且仅当目标数据库为 oracle 时才保留可执行的 ddl。如果你导出成 sql 文件后发现里面没有 create sequence ...,大概率是导出格式或兼容模式选错了。
导出前必须确认的三个设置项
Navicat 的“导出向导”里,光勾选“序列”远远不够,以下三项任一出错都会导致序列丢失或不可用:
- 导出格式必须选
SQL 文件(不能选“Excel”“CSV”或“Insert 语句”) - “导出模式”要选
DDL only或DDL + Data(选Data only会跳过所有 DDL,包括序列) - “Oracle 兼容性”需设为
Oracle(若误设为Generic或MySQL,Navicat 会跳过序列或生成无效语法)
导出的 SQL 里 sequence 没带 START WITH 值?
Navicat 默认导出的 CREATE SEQUENCE 语句使用的是序列的 INCREMENT BY 和 MAXVALUE 等定义,但不会自动读取并写入当前值(NEXTVAL)作为 START WITH。这意味着:恢复到新库后,第一次 NEXTVAL 可能和原库不一致。
解决办法只有手动补:
- 先查原序列当前值:
SELECT your_seq.CURRVAL FROM DUAL;(注意:需先调过一次NEXTVAL才能查CURRVAL) - 导出 SQL 后,在
CREATE SEQUENCE语句末尾手动加上START WITH xxx(xxx 是你查到的值 + 1) - 或者更稳妥:导出后改用
ALTER SEQUENCE your_seq RESTART START WITH xxx;(Oracle 12c+ 支持)
为什么从 Navicat 导出的 sequence 在目标库执行时报 ORA-00955?
这是最常被忽略的一点:Navicat 导出的 SQL 默认不包含 DROP SEQUENCE IF EXISTS(Oracle 本身也不支持 IF EXISTS)。如果目标库已存在同名 sequence,直接运行会报 ORA-00955: name is already used by an existing object。
安全做法是手动加判断逻辑(Oracle 12c+):
DECLARE
cnt INT;
BEGIN
SELECT COUNT(*) INTO cnt FROM user_sequences WHERE sequence_name = 'YOUR_SEQ';
IF cnt > 0 THEN
EXECUTE IMMEDIATE 'DROP SEQUENCE YOUR_SEQ';
END IF;
END;
/
再跟上你的 CREATE SEQUENCE 语句。别依赖 Navicat 自动生成这个逻辑——它不会。
真正麻烦的从来不是勾不勾“序列”,而是导出后那几行容易被跳过的 DDL 细节:START WITH 值、重复创建防护、权限依赖(比如 sequence 所属用户是否有 CREATE SEQUENCE 权限)。这些不手动核对,恢复时准卡住。


















