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