标签:INDEX NAME CONSTRAINT -- 索引 TABLE TYPE 主键 PLSQL
利用PLSQL导出ORACLE中的索引和主键,外键DDL语句在数据库迁移过程中,如果能够获取到表的主键和索引信息的创建DDL语句,那将大大方便了我们的迁移过程。
当然了,也可以利用如数据泵之类的工具来直接导出对应的信息,但是不必直接获取对应的ddl来的方便。
但是传统的方法采用DBMS_METEDATA.GET_DDL包来获取对应的DDL语句,也受限于DDL语句的长度,如果语句长度太长,则显示不完整。
下面分享一条语句可以直接将对应的DDL语句获取出来。
SELECT
T.TABLE_NAME , --表名
T.INDEX_NAME , --索引名
I.UNIQUENESS , --是否非空
I.INDEX_TYPE , --索引类型
C.CONSTRAINT_TYPE , --键类型
WM_CONCAT(T.COLUMN_NAME) COLS,
(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 --索引创建脚本拼接
'CREATE '
|| (CASE WHEN I.UNIQUENESS = 'UNIQUE' THEN I.UNIQUENESS
|| ' ' ELSE CASE WHEN I.INDEX_TYPE = 'NORMAL' THEN '' ELSE I.INDEX_TYPE
|| ' ' END END)
|| 'INDEX '
|| T.INDEX_NAME
|| ' ON '
|| T.TABLE_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 T.TABLE_NAME LIKE 'TB_%' --自建表规则(只查询自己创建的表【我的建表规则以TB_开头】,排除系统表)
AND I.INDEX_TYPE != 'FUNCTION-BASED NORMAL' --排除基于函数的索引
GROUP BY
T.TABLE_NAME,
T.INDEX_NAME,
I.UNIQUENESS,
I.INDEX_TYPE,
C.CONSTRAINT_TYPE;
拼接成mysql的脚本
SELECT
T.TABLE_NAME , --表名
T.INDEX_NAME , --索引名
I.UNIQUENESS , --是否非空
I.INDEX_TYPE , --索引类型
C.CONSTRAINT_TYPE , --键类型
WM_CONCAT(T.COLUMN_NAME) COLS,
(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 `FBP_SET_OF_BOOK` ADD INDEX FBP_CUSTOMER_COMPANY_IDX1 (`SOB_CODE`);--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.COLUMN_NAME != 'ID'
AND (T.TABLE_NAME LIKE 'ERP_%' or T.TABLE_NAME LIKE 'FBP_%' or T.TABLE_NAME LIKE 'SIE_%' or T.TABLE_NAME LIKE 'WFW_%') --自建表规则(只查询自己创建的表【我的建表规则以TB_开头】,排除系统表)
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;
标签:INDEX,NAME,CONSTRAINT,--,索引,TABLE,TYPE,主键,PLSQL 来源: https://www.cnblogs.com/jsliao/p/16192726.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。