在导出数据的时候 数据库会先导出序列 再导出表数据 就会导致表中的id大于序列的值 导致新插入数据时 报唯一约束错误
这时候我们可以重建序列 具体步骤为
注意修改语句中的username
SELECT ' create sequence username.' || SEQUENCE_NAME ||
' minvalue ' || MIN_VALUE ||
' maxvalue ' || MAX_VALUE ||
' start with ' || LAST_NUMBER ||
' increment by ' || INCREMENT_BY ||
' cache ' || CACHE_SIZE || ' ;'
FROM USER_SEQUENCES;
这里说一下 如果序列设置nocache
那么上面获取的CACHE_SIZE
就会为0 执行创建语句时会报 cache
必须大于1
的错误 所以可以在导出时设置个值
SELECT ' create sequence username.' || SEQUENCE_NAME ||
' minvalue ' || MIN_VALUE ||
' maxvalue ' || MAX_VALUE ||
' start with ' || LAST_NUMBER ||
' increment by ' || INCREMENT_BY ||
' cache 10;'
FROM USER_SEQUENCES;
或者用这个SQL(跟上面结果一样)
select dbms_metadata.get_ddl('SEQUENCE',u.object_name) from user_objects u where object_type='SEQUENCE';
同理要想查询创建表的语句可以这样写
select dbms_metadata.get_ddl('TABLE',u.object_name) from user_objects u where object_type='TABLE';
上面的那个查询建表语句的效率不高 下面这个会高一点
-- 全查
select dbms_metadata.get_ddl('TABLE',TABLE_NAME,user) from user_tables where table_name=&tab;
-- 查询某个表
select dbms_metadata.get_ddl('TABLE',TABLE_NAME,user) from user_tables where table_name=&tab;
关于cache
一般情况下都建议使用cache
如果要保证生成的id必须是连续的
则设置nocache
SELECT ' drop sequence username.' || SEQUENCE_NAME ||';' FROM USER_SEQUENCES;
我使用的工具是Oracle SQL Developer
上面的两步都可以在查询结果中生成一堆的sql语句 怎样把他们获取呢 一行一行复制实在是太慢了
我们可以在查询结果
上 右键
–> 导出
格式
选择text
左定界符
和右定界符
都设置为空
设置导出文件位置
下一步
–> 完成
得到的文件中第一行是没用的 删掉即可