oracle迁移mysql生成创建主键索引脚本

2024年 2月 22日 35.4k 0

oracle迁移到mysql生成主键索引脚本
除了使用下面sql脚本也可以考虑expdp contents=metadata_only+impdp sqlfile=xxx的方式。

1.创建函数–使用DBMS_LOB.SUBSTR函数将Clob转换为Varchar的代码示例:

CREATE OR REPLACE FUNCTION clob_to_varchar(c CLOB) RETURN VARCHAR2 AS
BEGIN
RETURN DBMS_LOB.SUBSTR(c, DBMS_LOB.GETLENGTH(c), 1);
END;
/

2.准备SQL脚本:(可自行调整)

SELECT
T.TABLE_NAME , --表名
T.INDEX_NAME , --索引名
I.UNIQUENESS , --是否非空
I.INDEX_TYPE , --索引类型
C.CONSTRAINT_TYPE , --键类型
clob_to_varchar(WM_CONCAT(T.COLUMN_NAME)) COLS,
clob_to_varchar(CASE WHEN C.CONSTRAINT_TYPE = 'P' OR C.CONSTRAINT_TYPE = 'R' THEN --主键和外键创建脚本拼接
'ALTER TABLE '
|| T.TABLE_NAME
|| ' ADD CONSTRAINT '
|| T.INDEX_NAME
|| (CASE WHEN C.CONSTRAINT_TYPE = 'P' THEN ' PRIMARY KEY (' ELSE ' FOREIGN KEY (' END)
|| WM_CONCAT(T.COLUMN_NAME)
|| ');' ELSE --索引创建脚本拼接 ALTER TABLE `XXX` ADD INDEX XXX (`XXX`);--UNIQUE
'ALTER TABLE `'
|| T.TABLE_NAME
|| '` ADD '
|| (CASE WHEN I.UNIQUENESS = 'UNIQUE' THEN I.UNIQUENESS
|| ' ' ELSE 'INDEX ' END)

|| T.INDEX_NAME
|| '(`'
|| WM_CONCAT(COLUMN_NAME)
|| '`);' END) SQL_CMD --拼接创建脚本
FROM
USER_IND_COLUMNS T,
USER_INDEXES I ,
USER_CONSTRAINTS C
WHERE
T.INDEX_NAME = I.INDEX_NAME
AND T.INDEX_NAME = C.CONSTRAINT_NAME(+)
AND I.INDEX_TYPE != 'FUNCTION-BASED NORMAL' --排除基于函数的索引
AND (T.TABLE_NAME LIKE 'DES_%' or T.TABLE_NAME LIKE 'TEST_%') --特定表规则
--AND (C.CONSTRAINT_TYPE != 'P' or C.CONSTRAINT_TYPE is null) --排除主键索引
GROUP BY
T.TABLE_NAME,
T.INDEX_NAME,
I.UNIQUENESS,
I.INDEX_TYPE,
C.CONSTRAINT_TYPE;

3.执行2的查询得到类似结果:

相关参考:
https://blog.csdn.net/jycjyc/article/details/136214062

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论