一、数据库驱动类、端口、默认用户名密码

数据库 驱动 端口 用户名 密码
MySQL com.mysql.jdbc.Driver 3306 root root
DB2 com.ibm.db2.jcc.DB2Driver 50000 db2inst1 db2inst1
Oracle oracle.jdbc.OracleDriver 1521 system manager
SQLServer com.microsoft.sqlserver.jdbc.SQLServerDriver 1433 sa sa
PostgreSQL org.postgresql.Driver 5432 postgres postgres
Mariadb org.mariadb.jdbc.Driver 3306 root root
GreenPlum com.pivotal.jdbc.GreenplumDriver 5432 gpadmin gpadmin
Teradata com.teradata.jdbc.TeraDriver 1025 dbc dbc

二、数据库的JDBC连接字符串

数据库 JDBC连接串
MySQL jdbc:mysql://${dbHost}:${dbPort}/${dbName}?useSSL=false&useUnicode=true&characterEncoding=utf8
DB2 jdbc:db2://${dbHost}:${dbPort}/${dbName}
Oracle

jdbc:oracle:thin:@${dbHost}:${dbPort}:${dbName}       # SID

jdbc:oracle:thin:@//${dbHost}:${dbPort}/${dbName}     # ServiceName

SQLServer jdbc:sqlserver://${dbHost}:${dbPort};databaseName=${dbName}
PostgreSQL jdbc:postgresql://${dbHost}:${dbPort}/${dbName}
Mariadb jdbc:mariadb://${dbHost}:${dbPort}/${dbName}
GreenPlum jdbc:pivotal:greenplum://${dbHost}:${dbPort};DatabaseName=${dbName}
Teradata jdbc:teradata://${dbHost}/DATABASE=${dbName},DBS_PORT=${dbPort},CLIENT_CHARSET=EUC_CN,TMODE=TERA,CHARSET=ASCII

三、数据库的元数据抽取

  • MySQL
  1. /* 完成 */
  2. SELECT UPPER(TRIM(T.TABLE_SCHEMA)) AS 模式
  3. , UPPER(TRIM(T.TABLE_NAME)) AS 表名称
  4. , T.TABLE_COMMENT AS 表注释
  5. , UPPER(TRIM(C.COLUMN_NAME)) AS 列名称
  6. , C.COLUMN_COMMENT AS 列注释
  7. , UPPER(TRIM(C.DATA_TYPE)) AS 列类型
  8. , IFNULL(C.CHARACTER_MAXIMUM_LENGTH,C.NUMERIC_PRECISION) AS 列长度
  9. , C.NUMERIC_SCALE AS 小数位数
  10. , CASE WHEN C.COLUMN_KEY = 'PRI' THEN 'Y' ELSE NULL END AS 是否主键
  11. , CASE WHEN C.IS_NULLABLE = 'NO' THEN 'N' ELSE NULL END AS 是否可为空
  12. , C.COLUMN_DEFAULT AS 列默认值
  13. , I.INDEXES AS 索引名称
  14. , C.ORDINAL_POSITION AS 列顺序
  15. FROM INFORMATION_SCHEMA.COLUMNS C --
  16. INNER JOIN INFORMATION_SCHEMA.TABLES T --
  17. ON T.TABLE_NAME = C.TABLE_NAME
  18. AND T.TABLE_SCHEMA = C.TABLE_SCHEMA
  19. AND T.TABLE_TYPE = 'BASE TABLE' -- 限制为表
  20. LEFT JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE K -- 列约束
  21. ON C.TABLE_NAME = K.TABLE_NAME
  22. AND C.COLUMN_NAME = K.COLUMN_NAME
  23. AND C.TABLE_SCHEMA = K.TABLE_SCHEMA
  24. LEFT JOIN ( -- 查询列上的索引名称(多个逗号分隔)
  25. SELECT TABLE_NAME, COLUMN_NAME, GROUP_CONCAT(INDEX_NAME) AS INDEXES
  26. FROM INFORMATION_SCHEMA.STATISTICS
  27. WHERE UPPER(TABLE_SCHEMA) = UPPER('${dbName}')
  28. GROUP BY TABLE_NAME, COLUMN_NAME
  29. ) I
  30. ON C.TABLE_NAME = I.TABLE_NAME
  31. AND C.COLUMN_NAME = I.COLUMN_NAME
  32. WHERE UPPER(TRIM(C.TABLE_SCHEMA)) = UPPER('${dbName}')
  33. ORDER BY C.TABLE_NAME, C.ORDINAL_POSITION
  • DB2
  1. /* 完成
  2. * SYSIBM 基本表,对DB2使用进行最优化
  3. * SYSCAT 基于SYSIBM表的视图,对平常轻负荷使用进行优化
  4. */
  5. SELECT TRIM(C.TABSCHEMA) AS 模式
  6. , T.TABNAME AS 表名称
  7. , T.REMARKS AS 表注释
  8. , C.COLNAME AS 列名称
  9. , C.REMARKS AS 列注释
  10. , C.TYPENAME AS 列类型
  11. , C.LENGTH AS 列长度
  12. , C.SCALE AS 小数位数
  13. , NVL2(P.COLNAME,'Y',NULL) AS 主键
  14. , DECODE(C.NULLS,'N','N',NULL) AS 可空
  15. , VARCHAR(C.DEFAULT) AS 默认
  16. , Y.INDEXES AS 索引
  17. , C.COLNO AS 列顺序
  18. FROM SYSCAT.COLUMNS C --
  19. INNER JOIN SYSCAT.TABLES T --
  20. ON C.TABSCHEMA = T.TABSCHEMA
  21. AND C.TABNAME = T.TABNAME
  22. LEFT JOIN ( -- DbVisualizerDEBUG中取得
  23. SELECT TC.CONSTNAME, KC.COLNAME,TC.TABSCHEMA,TC.TABNAME
  24. FROM SYSCAT.TABCONST TC -- 表约束: 主键P, 外键F, 唯一U, 表检查K
  25. , SYSCAT.KEYCOLUSE KC -- 关键列使用表
  26. WHERE TC.TABSCHEMA = KC.TABSCHEMA
  27. AND TC.TABNAME = KC.TABNAME
  28. AND TC.CONSTNAME = KC.CONSTNAME
  29. AND TC.TYPE = 'P' -- 限制为主键
  30. ) P
  31. ON C.TABSCHEMA = P.TABSCHEMA
  32. AND C.TABNAME = P.TABNAME
  33. AND C.COLNAME = P.COLNAME
  34. LEFT JOIN ( -- 列及列上的多个索引
  35. SELECT X.TABSCHEMA, X.TABNAME, X.COLNAME, LISTAGG(X.INDNAME, ',') WITHIN GROUP(ORDER BY COLSORT) AS INDEXES
  36. FROM (-- 索引与列的对应关系
  37. SELECT C.TABSCHEMA, C.TABNAME, C.COLNAME, I.INDNAME, INSTR(I.COLNAMES, '+' || C.COLNAME) AS COLSORT
  38. FROM SYSCAT.INDEXES I -- 索引
  39. INNER JOIN SYSCAT.COLUMNS C --
  40. ON C.TABSCHEMA = I.TABSCHEMA
  41. AND C.TABNAME = I.TABNAME
  42. AND INSTR(I.COLNAMES, '+' || C.COLNAME) > 0 -- DB2索引对应的列放在COLNAMES里面,格式: +列1+列2
  43. WHERE I.OWNERTYPE = 'U'
  44. ) X
  45. GROUP BY X.TABSCHEMA, X.TABNAME, X.COLNAME
  46. ) Y
  47. ON C.TABSCHEMA = Y.TABSCHEMA
  48. AND C.TABNAME = Y.TABNAME
  49. AND C.COLNAME = Y.COLNAME
  50. WHERE T.TYPE = 'T'
  51. AND T.OWNERTYPE = 'U'
  52. AND C.TABSCHEMA NOT LIKE 'SYS%'
  53. AND C.TABSCHEMA <> 'SQLJ'
  54. ORDER BY C.TABSCHEMA, C.TABNAME, C.COLNO
  • Oracle
  1. /* 完成 */
  2. SELECT
  3. SYS_CONTEXT('USERENV','CURRENT_SCHEMA') AS 模式
  4. , H.TABLE_NAME AS 表名称
  5. , H.COMMENTS AS 表注释
  6. , T.COLUMN_NAME AS 列名称
  7. , A.COMMENTS AS 列注释
  8. , T.DATA_TYPE AS 列类型
  9. , NVL(T.DATA_LENGTH, T.DATA_PRECISION) AS 列长度
  10. , T.DATA_SCALE AS 小数位数
  11. , B.PK AS 主键
  12. , DECODE(T.NULLABLE, 'N', 'N') AS 可空
  13. , T.DATA_DEFAULT AS 默认
  14. , C.INDEXES AS 索引
  15. , T.COLUMN_ID AS 列顺序
  16. FROM USER_TAB_COLUMNS T -- 表列
  17. LEFT JOIN USER_TAB_COMMENTS H -- 表注释
  18. ON H.TABLE_NAME = T.TABLE_NAME
  19. LEFT JOIN USER_COL_COMMENTS A -- 列注释
  20. ON A.TABLE_NAME = T.TABLE_NAME
  21. AND A.COLUMN_NAME = T.COLUMN_NAME
  22. LEFT JOIN (
  23. SELECT M.TABLE_NAME,M.COLUMN_NAME, 'Y' AS PK
  24. FROM USER_CONS_COLUMNS M -- 约束对应列
  25. INNER JOIN USER_CONSTRAINTS N -- 约束
  26. ON M.CONSTRAINT_NAME = N.CONSTRAINT_NAME
  27. WHERE N.CONSTRAINT_TYPE = 'P'
  28. ) B
  29. ON B.TABLE_NAME = T.TABLE_NAME
  30. AND B.COLUMN_NAME = T.COLUMN_NAME
  31. LEFT JOIN (
  32. SELECT TABLE_NAME, COLUMN_NAME, LISTAGG(INDEX_NAME, ',') WITHIN GROUP(ORDER BY INDEX_NAME) AS INDEXES
  33. FROM USER_IND_COLUMNS
  34. GROUP BY TABLE_NAME, COLUMN_NAME
  35. ) C
  36. ON C.TABLE_NAME = T.TABLE_NAME
  37. AND C.COLUMN_NAME = T.COLUMN_NAME
  38. WHERE T.TABLE_NAME IN (SELECT TABLE_NAME FROM USER_TABLES)
  39. ORDER BY T.TABLE_NAME, T.COLUMN_ID
  • SQLServer
  1. /* 完成 */
  2. SELECT Upper(C.TABLE_SCHEMA) AS 模式
  3. , Upper(C.TABLE_NAME) AS 表名称
  4. , M.TABCOMMENT AS 表注释
  5. , Upper(C.COLUMN_NAME) AS 列名称
  6. , M.COLCOMMENT AS 列注释
  7. , Upper(C.DATA_TYPE) AS 数据类型
  8. , ISNULL(C.CHARACTER_MAXIMUM_LENGTH,C.NUMERIC_PRECISION) AS 列长度
  9. , C.NUMERIC_PRECISION AS 小数位数
  10. , CASE WHEN P.COLUMN_NAME IS NULL THEN NULL ELSE 'Y' END AS 是否主键
  11. , CASE WHEN SUBSTRING(C.IS_NULLABLE,1,1) = 'N' THEN 'N' ELSE NULL END AS 是否可为空
  12. , C.COLUMN_DEFAULT AS 列默认值
  13. , N.INDEXES AS 索引名称
  14. , C.ORDINAL_POSITION AS 列顺序
  15. FROM INFORMATION_SCHEMA.COLUMNS C
  16. LEFT JOIN ( -- 表和列的注释
  17. SELECT T.NAME AS TABNAME
  18. , CONVERT(VARCHAR(1024),E1.VALUE) AS TABCOMMENT
  19. , C.NAME AS COLNAME
  20. , CONVERT(VARCHAR(1024),E2.VALUE) AS COLCOMMENT
  21. FROM SYS.TABLES T --
  22. INNER JOIN SYS.COLUMNS C --
  23. ON C.OBJECT_ID = T.OBJECT_ID
  24. LEFT JOIN SYS.EXTENDED_PROPERTIES E1 -- 系统属性表
  25. ON E1.MAJOR_ID = T.OBJECT_ID
  26. AND E1.CLASS = 1
  27. AND E1.MINOR_ID = 0 -- 限制是表的注释
  28. LEFT JOIN SYS.EXTENDED_PROPERTIES E2 -- 系统属性表
  29. ON E2.MAJOR_ID = C.OBJECT_ID
  30. AND E2.CLASS = 1
  31. AND E2.MINOR_ID = C.COLUMN_ID -- 限制是列的注释
  32. WHERE ObjectProperty(T.OBJECT_ID, 'IsUserTable') = 1 -- 限制为用户建立的表
  33. ) M
  34. ON M.TABNAME = C.TABLE_NAME
  35. AND M.COLNAME = C.COLUMN_NAME
  36. LEFT JOIN ( -- 主键约束
  37. SELECT TC.TABLE_SCHEMA, TC.TABLE_NAME, CC.COLUMN_NAME
  38. FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC -- 表约束(表名,约束名,约束类型)
  39. INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE CC -- 约束使用的列(根据约束名关联)
  40. ON TC.CONSTRAINT_NAME = CC.CONSTRAINT_NAME
  41. WHERE TC.CONSTRAINT_TYPE = 'PRIMARY KEY'
  42. ) P
  43. ON C.TABLE_SCHEMA = P.TABLE_SCHEMA
  44. AND C.TABLE_NAME = P.TABLE_NAME
  45. AND C.COLUMN_NAME = P.COLUMN_NAME
  46. LEFT JOIN ( -- 索引
  47. SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, LEFT(INDEXES, LEN(INDEXES) - 1) AS INDEXES
  48. FROM (
  49. SELECT K.TABLE_SCHEMA
  50. , K.TABLE_NAME
  51. , K.COLUMN_NAME
  52. , (SELECT N.CONSTRAINT_NAME + ','
  53. FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE N
  54. WHERE N.TABLE_SCHEMA = K.TABLE_SCHEMA
  55. AND N.TABLE_NAME = K.TABLE_NAME
  56. AND N.COLUMN_NAME = K.COLUMN_NAME
  57. FOR XML PATH('')) AS INDEXES
  58. FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE K
  59. GROUP BY K.TABLE_SCHEMA, K.TABLE_NAME, K.COLUMN_NAME
  60. ) K
  61. ) N
  62. ON C.TABLE_SCHEMA = N.TABLE_SCHEMA
  63. AND C.TABLE_NAME = N.TABLE_NAME
  64. AND C.COLUMN_NAME = N.COLUMN_NAME
  65. ORDER BY C.TABLE_SCHEMA, C.TABLE_NAME, C.ORDINAL_POSITION
  • PostgreSQL
  1. /* 除了索引, 其他完成 */
  2. SELECT
  3. UPPER(C.TABLE_SCHEMA) AS 模式
  4. , UPPER(C.TABLE_NAME) AS 表名称
  5. , C.TAB_COMMENT AS 表注释
  6. , UPPER(C.COLUMN_NAME) AS 列名称
  7. , C.COL_COMMENT AS 列注释
  8. , UPPER(C.DATA_TYPE) AS 列类型
  9. , COALESCE(C.CHARACTER_MAXIMUM_LENGTH,C.NUMERIC_PRECISION) AS 列长度
  10. , C.NUMERIC_SCALE AS 小数位数
  11. , C.COL_PRIMARY AS 是否主键
  12. , CASE WHEN SUBSTR(C.IS_NULLABLE,1,1) = 'N' THEN 'N'ELSE NULL END AS 是否可空
  13. , CASE -- 字符串的默认值存储的是: 'N'::CHARACTER VARYING, 因此特殊处理
  14. WHEN SUBSTR(C.COLUMN_DEFAULT,1,1) = ''''
  15. THEN SUBSTR(C.COLUMN_DEFAULT,2, POSITION('''' IN SUBSTR(C.COLUMN_DEFAULT,2)) - 1)
  16. ELSE C.COLUMN_DEFAULT
  17. END AS 默认
  18. , NULL AS 索引 -- PostgreSQL中的索引好麻烦,没找到合适的方法取
  19. , C.ORDINAL_POSITION AS 字段顺序
  20. FROM (
  21. -- information_schema.columns 的定义: 追加表注释,列注释及索引信息
  22. SELECT current_database()::information_schema.sql_identifier AS table_catalog, nc.nspname::information_schema.sql_identifier AS table_schema, c.relname::information_schema.sql_identifier AS table_name, a.attname::information_schema.sql_identifier AS column_name, a.attnum::information_schema.cardinal_number AS ordinal_position, pg_get_expr(ad.adbin, ad.adrelid)::information_schema.character_data AS column_default,
  23. CASE
  24. WHEN a.attnotnull OR (t.typtype = 'd'::"char" AND t.typnotnull) THEN 'NO'::text
  25. ELSE 'YES'::text
  26. END::information_schema.character_data AS is_nullable,
  27. CASE
  28. WHEN t.typtype = 'd'::"char" THEN
  29. CASE
  30. WHEN bt.typelem <> 0::oid AND bt.typlen = (-1) THEN 'ARRAY'::text
  31. WHEN nbt.nspname = 'pg_catalog'::name THEN format_type(t.typbasetype, NULL::integer)
  32. ELSE 'USER-DEFINED'::text
  33. END
  34. ELSE
  35. CASE
  36. WHEN t.typelem <> 0::oid AND t.typlen = (-1) THEN 'ARRAY'::text
  37. WHEN nt.nspname = 'pg_catalog'::name THEN format_type(a.atttypid, NULL::integer)
  38. ELSE 'USER-DEFINED'::text
  39. END
  40. END::information_schema.character_data AS data_type, information_schema._pg_char_max_length(information_schema._pg_truetypid(a.*, t.*), information_schema._pg_truetypmod(a.*, t.*))::information_schema.cardinal_number AS character_maximum_length, information_schema._pg_char_octet_length(information_schema._pg_truetypid(a.*, t.*), information_schema._pg_truetypmod(a.*, t.*))::information_schema.cardinal_number AS character_octet_length, information_schema._pg_numeric_precision(information_schema._pg_truetypid(a.*, t.*), information_schema._pg_truetypmod(a.*, t.*))::information_schema.cardinal_number AS numeric_precision, information_schema._pg_numeric_precision_radix(information_schema._pg_truetypid(a.*, t.*), information_schema._pg_truetypmod(a.*, t.*))::information_schema.cardinal_number AS numeric_precision_radix, information_schema._pg_numeric_scale(information_schema._pg_truetypid(a.*, t.*), information_schema._pg_truetypmod(a.*, t.*))::information_schema.cardinal_number AS numeric_scale, information_schema._pg_datetime_precision(information_schema._pg_truetypid(a.*, t.*), information_schema._pg_truetypmod(a.*, t.*))::information_schema.cardinal_number AS datetime_precision, NULL::character varying::information_schema.character_data AS interval_type, NULL::character varying::information_schema.character_data AS interval_precision, NULL::character varying::information_schema.sql_identifier AS character_set_catalog, NULL::character varying::information_schema.sql_identifier AS character_set_schema, NULL::character varying::information_schema.sql_identifier AS character_set_name, NULL::character varying::information_schema.sql_identifier AS collation_catalog, NULL::character varying::information_schema.sql_identifier AS collation_schema, NULL::character varying::information_schema.sql_identifier AS collation_name,
  41. CASE
  42. WHEN t.typtype = 'd'::"char" THEN current_database()
  43. ELSE NULL::name
  44. END::information_schema.sql_identifier AS domain_catalog,
  45. CASE
  46. WHEN t.typtype = 'd'::"char" THEN nt.nspname
  47. ELSE NULL::name
  48. END::information_schema.sql_identifier AS domain_schema,
  49. CASE
  50. WHEN t.typtype = 'd'::"char" THEN t.typname
  51. ELSE NULL::name
  52. END::information_schema.sql_identifier AS domain_name, current_database()::information_schema.sql_identifier AS udt_catalog, COALESCE(nbt.nspname, nt.nspname)::information_schema.sql_identifier AS udt_schema, COALESCE(bt.typname, t.typname)::information_schema.sql_identifier AS udt_name, NULL::character varying::information_schema.sql_identifier AS scope_catalog, NULL::character varying::information_schema.sql_identifier AS scope_schema, NULL::character varying::information_schema.sql_identifier AS scope_name, NULL::integer::information_schema.cardinal_number AS maximum_cardinality, a.attnum::information_schema.sql_identifier AS dtd_identifier, 'NO'::character varying::information_schema.character_data AS is_self_referencing, 'NO'::character varying::information_schema.character_data AS is_identity, NULL::character varying::information_schema.character_data AS identity_generation, NULL::character varying::information_schema.character_data AS identity_start, NULL::character varying::information_schema.character_data AS identity_increment, NULL::character varying::information_schema.character_data AS identity_maximum, NULL::character varying::information_schema.character_data AS identity_minimum, NULL::character varying::information_schema.character_data AS identity_cycle, 'NEVER'::character varying::information_schema.character_data AS is_generated, NULL::character varying::information_schema.character_data AS generation_expression,
  53. CASE
  54. WHEN c.relkind = 'r'::"char" THEN 'YES'::text
  55. ELSE 'NO'::text
  56. END::information_schema.character_data AS is_updatable
  57. -- 追加两个注释和是否为主键
  58. , cast(obj_description(c.relfilenode,'pg_class') as varchar) AS tab_comment
  59. , col_description(a.attrelid,a.attnum) AS col_comment
  60. , case when con.conname is not null then 'Y' else null end as col_primary
  61. FROM pg_attribute a
  62. -- 追加是不是主键
  63. LEFT JOIN pg_constraint con ON con.conrelid = a.attrelid AND con.conkey[] = a.attnum
  64. LEFT JOIN pg_attrdef ad ON a.attrelid = ad.adrelid AND a.attnum = ad.adnum, pg_class c, pg_namespace nc, pg_type t
  65. JOIN pg_namespace nt ON t.typnamespace = nt.oid
  66. LEFT JOIN (pg_type bt
  67. JOIN pg_namespace nbt ON bt.typnamespace = nbt.oid) ON t.typtype = 'd'::"char" AND t.typbasetype = bt.oid
  68.  
  69. WHERE a.attrelid = c.oid AND a.atttypid = t.oid AND nc.oid = c.relnamespace AND NOT pg_is_other_temp_schema(nc.oid) AND a.attnum > 0 AND NOT a.attisdropped AND (c.relkind = ANY (ARRAY['r'::"char", 'v'::"char"])) AND (pg_has_role(c.relowner, 'USAGE'::text) OR has_table_privilege(c.oid, 'SELECT'::text) OR has_table_privilege(c.oid, 'INSERT'::text) OR has_table_privilege(c.oid, 'UPDATE'::text) OR has_table_privilege(c.oid, 'REFERENCES'::text))
  70. ) c
  71. WHERE C.TABLE_NAME IN (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE')
  72. AND C.TABLE_SCHEMA NOT IN ('information_schema','pg_catalog') -- 排除信息模式和系统本身元数据模式
  73. AND C.TABLE_SCHEMA NOT LIKE 'pg|_%' escape '|' -- 排除pg系统表
  74. AND C.TABLE_SCHEMA NOT LIKE 'gp|_%' escape '|' -- 排除gp系统表
  75. ORDER BY C.TABLE_CATALOG, C.TABLE_SCHEMA, C.TABLE_NAME, C.ORDINAL_POSITION
  • Mariadb(参考MySQL)
  • GreenPlum
  1. /* 除了索引和分布键, 其他完成 */
  2. SELECT
  3. UPPER(C.TABLE_SCHEMA) AS 模式
  4. , UPPER(C.TABLE_NAME) AS 表名称
  5. , C.TAB_COMMENT AS 表注释
  6. , UPPER(C.COLUMN_NAME) AS 列名称
  7. , C.COL_COMMENT AS 列注释
  8. , UPPER(C.DATA_TYPE) AS 列类型
  9. , COALESCE(C.CHARACTER_MAXIMUM_LENGTH,C.NUMERIC_PRECISION) AS 列长度
  10. , C.NUMERIC_SCALE AS 小数位数
  11. , C.COL_PRIMARY AS 是否主键
  12. , CASE WHEN SUBSTR(C.IS_NULLABLE,1,1) = 'N' THEN 'N'ELSE NULL END AS 是否可空
  13. , CASE -- 字符串的默认值存储的是: 'N'::CHARACTER VARYING, 因此特殊处理
  14. WHEN SUBSTR(C.COLUMN_DEFAULT,1,1) = ''''
  15. THEN SUBSTR(C.COLUMN_DEFAULT,2, POSITION('''' IN SUBSTR(C.COLUMN_DEFAULT,2)) - 1)
  16. ELSE C.COLUMN_DEFAULT
  17. END AS 默认
  18. , NULL AS 索引 -- PostgreSQL中的索引好麻烦,没找到合适的方法取
  19. , C.ORDINAL_POSITION AS 字段顺序
  20. FROM (
  21. -- information_schema.columns 的定义: 追加表注释,列注释及索引信息
  22. SELECT current_database()::information_schema.sql_identifier AS table_catalog, nc.nspname::information_schema.sql_identifier AS table_schema, c.relname::information_schema.sql_identifier AS table_name, a.attname::information_schema.sql_identifier AS column_name, a.attnum::information_schema.cardinal_number AS ordinal_position, pg_get_expr(ad.adbin, ad.adrelid)::information_schema.character_data AS column_default,
  23. CASE
  24. WHEN a.attnotnull OR (t.typtype = 'd'::"char" AND t.typnotnull) THEN 'NO'::text
  25. ELSE 'YES'::text
  26. END::information_schema.character_data AS is_nullable,
  27. CASE
  28. WHEN t.typtype = 'd'::"char" THEN
  29. CASE
  30. WHEN bt.typelem <> 0::oid AND bt.typlen = (-1) THEN 'ARRAY'::text
  31. WHEN nbt.nspname = 'pg_catalog'::name THEN format_type(t.typbasetype, NULL::integer)
  32. ELSE 'USER-DEFINED'::text
  33. END
  34. ELSE
  35. CASE
  36. WHEN t.typelem <> 0::oid AND t.typlen = (-1) THEN 'ARRAY'::text
  37. WHEN nt.nspname = 'pg_catalog'::name THEN format_type(a.atttypid, NULL::integer)
  38. ELSE 'USER-DEFINED'::text
  39. END
  40. END::information_schema.character_data AS data_type, information_schema._pg_char_max_length(information_schema._pg_truetypid(a.*, t.*), information_schema._pg_truetypmod(a.*, t.*))::information_schema.cardinal_number AS character_maximum_length, information_schema._pg_char_octet_length(information_schema._pg_truetypid(a.*, t.*), information_schema._pg_truetypmod(a.*, t.*))::information_schema.cardinal_number AS character_octet_length, information_schema._pg_numeric_precision(information_schema._pg_truetypid(a.*, t.*), information_schema._pg_truetypmod(a.*, t.*))::information_schema.cardinal_number AS numeric_precision, information_schema._pg_numeric_precision_radix(information_schema._pg_truetypid(a.*, t.*), information_schema._pg_truetypmod(a.*, t.*))::information_schema.cardinal_number AS numeric_precision_radix, information_schema._pg_numeric_scale(information_schema._pg_truetypid(a.*, t.*), information_schema._pg_truetypmod(a.*, t.*))::information_schema.cardinal_number AS numeric_scale, information_schema._pg_datetime_precision(information_schema._pg_truetypid(a.*, t.*), information_schema._pg_truetypmod(a.*, t.*))::information_schema.cardinal_number AS datetime_precision, NULL::character varying::information_schema.character_data AS interval_type, NULL::character varying::information_schema.character_data AS interval_precision, NULL::character varying::information_schema.sql_identifier AS character_set_catalog, NULL::character varying::information_schema.sql_identifier AS character_set_schema, NULL::character varying::information_schema.sql_identifier AS character_set_name, NULL::character varying::information_schema.sql_identifier AS collation_catalog, NULL::character varying::information_schema.sql_identifier AS collation_schema, NULL::character varying::information_schema.sql_identifier AS collation_name,
  41. CASE
  42. WHEN t.typtype = 'd'::"char" THEN current_database()
  43. ELSE NULL::name
  44. END::information_schema.sql_identifier AS domain_catalog,
  45. CASE
  46. WHEN t.typtype = 'd'::"char" THEN nt.nspname
  47. ELSE NULL::name
  48. END::information_schema.sql_identifier AS domain_schema,
  49. CASE
  50. WHEN t.typtype = 'd'::"char" THEN t.typname
  51. ELSE NULL::name
  52. END::information_schema.sql_identifier AS domain_name, current_database()::information_schema.sql_identifier AS udt_catalog, COALESCE(nbt.nspname, nt.nspname)::information_schema.sql_identifier AS udt_schema, COALESCE(bt.typname, t.typname)::information_schema.sql_identifier AS udt_name, NULL::character varying::information_schema.sql_identifier AS scope_catalog, NULL::character varying::information_schema.sql_identifier AS scope_schema, NULL::character varying::information_schema.sql_identifier AS scope_name, NULL::integer::information_schema.cardinal_number AS maximum_cardinality, a.attnum::information_schema.sql_identifier AS dtd_identifier, 'NO'::character varying::information_schema.character_data AS is_self_referencing, 'NO'::character varying::information_schema.character_data AS is_identity, NULL::character varying::information_schema.character_data AS identity_generation, NULL::character varying::information_schema.character_data AS identity_start, NULL::character varying::information_schema.character_data AS identity_increment, NULL::character varying::information_schema.character_data AS identity_maximum, NULL::character varying::information_schema.character_data AS identity_minimum, NULL::character varying::information_schema.character_data AS identity_cycle, 'NEVER'::character varying::information_schema.character_data AS is_generated, NULL::character varying::information_schema.character_data AS generation_expression,
  53. CASE
  54. WHEN c.relkind = 'r'::"char" THEN 'YES'::text
  55. ELSE 'NO'::text
  56. END::information_schema.character_data AS is_updatable
  57. -- 追加两个注释和是否为主键
  58. , cast(obj_description(c.relfilenode,'pg_class') as varchar) AS tab_comment
  59. , col_description(a.attrelid,a.attnum) AS col_comment
  60. , case when con.conname is not null then 'Y' else null end as col_primary
  61. FROM pg_attribute a
  62. -- 追加是不是主键
  63. LEFT JOIN pg_constraint con ON con.conrelid = a.attrelid AND con.conkey[] = a.attnum
  64. LEFT JOIN pg_attrdef ad ON a.attrelid = ad.adrelid AND a.attnum = ad.adnum, pg_class c, pg_namespace nc, pg_type t
  65. JOIN pg_namespace nt ON t.typnamespace = nt.oid
  66. LEFT JOIN (pg_type bt
  67. JOIN pg_namespace nbt ON bt.typnamespace = nbt.oid) ON t.typtype = 'd'::"char" AND t.typbasetype = bt.oid
  68.  
  69. WHERE a.attrelid = c.oid AND a.atttypid = t.oid AND nc.oid = c.relnamespace AND NOT pg_is_other_temp_schema(nc.oid) AND a.attnum > 0 AND NOT a.attisdropped AND (c.relkind = ANY (ARRAY['r'::"char", 'v'::"char"])) AND (pg_has_role(c.relowner, 'USAGE'::text) OR has_table_privilege(c.oid, 'SELECT'::text) OR has_table_privilege(c.oid, 'INSERT'::text) OR has_table_privilege(c.oid, 'UPDATE'::text) OR has_table_privilege(c.oid, 'REFERENCES'::text))
  70. ) c
  71. WHERE C.TABLE_NAME IN (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE')
  72. AND C.TABLE_SCHEMA NOT IN ('information_schema','pg_catalog') -- 排除信息模式和系统本身元数据模式
  73. AND C.TABLE_SCHEMA NOT LIKE 'pg|_%' escape '|' -- 排除pg系统表
  74. AND C.TABLE_SCHEMA NOT LIKE 'gp|_%' escape '|' -- 排除gp系统表
  75. ORDER BY C.TABLE_CATALOG, C.TABLE_SCHEMA, C.TABLE_NAME, C.ORDINAL_POSITION
  • Teradata
  1. /* 完成 */
  2. SELECT
  3. TRIM(C.DatabaseName) AS 数据库
  4. , TRIM(C.TableName) AS 表名称
  5. , TRIM(T.CommentString) AS 表注释
  6. , TRIM(C.ColumnName) AS 列名称
  7. , TRIM(NVL(C.ColumnTitle,C.CommentString)) AS 列注释
  8. /* Teradata® RDBMS Data Dictionary的P76页System View Columns Reference的ColumnType枚举 (B035-1092-061A)*/
  9. /* 版本较旧,枚举值可能不全, 最新版手册没有找到这个枚举值 */
  10. , CASE TRIM(C.ColumnType)
  11. WHEN 'AT' THEN 'TIME'
  12. WHEN 'BF' THEN 'BYTE'
  13. WHEN 'BV' THEN 'VARBYTE'
  14. WHEN 'CF' THEN 'CHAR'
  15. WHEN 'CV' THEN 'VARCHAR'
  16. WHEN 'D' THEN 'DECIMAL'
  17. WHEN 'DA' THEN 'DATE'
  18. WHEN 'DH' THEN 'INTERVAL DAY TO HOUR'
  19. WHEN 'DM' THEN 'INTERVAL DAY TO MINUTE'
  20. WHEN 'DS' THEN 'INTERVAL DAY TO SECOND'
  21. WHEN 'DY' THEN 'INTERVAL DAY'
  22. WHEN 'F' THEN 'FLOAT'
  23. WHEN 'GF' THEN 'GRAPHIC'
  24. WHEN 'GV' THEN 'VARGRAPHIC'
  25. WHEN 'HM' THEN 'INTERVAL HOUR TO MINUTE'
  26. WHEN 'HR' THEN 'INTERVAL HOUR'
  27. WHEN 'HS' THEN 'INTERVAL HOUR TO SECOND'
  28. WHEN 'I1' THEN 'BYTEINT'
  29. WHEN 'I2' THEN 'SMALLINT'
  30. WHEN 'I8' THEN 'BYTEINTEGER'
  31. WHEN 'I' THEN 'INTEGER'
  32. WHEN 'MI' THEN 'INTERVAL MINUTE'
  33. WHEN 'MO' THEN 'INTERVAL MONTH'
  34. WHEN 'MS' THEN 'INTERVAL MINUTE TO SECOND'
  35. WHEN 'SC' THEN 'INTERVAL SECOND'
  36. WHEN 'SZ' THEN 'TIMESTAMP WITH TIME ZONE'
  37. WHEN 'TS' THEN 'TIMESTAMP'
  38. WHEN 'TZ' THEN 'TIME WITH TIME ZONE'
  39. WHEN 'YM' THEN 'INTERVAL YEAR TO MONTH'
  40. WHEN 'YR' THEN 'INTERVAL YEAR'
  41. ELSE C.ColumnType
  42. END
  43. , NVL(C.ColumnLength,C.DecimalTotalDigits) AS 数据长度
  44. , C.DecimalFractionalDigits AS 小数位数
  45. , NVL2(I.ColumnName,'Y',NULL) AS 是否主键
  46. , CASE WHEN C.Nullable = 'N' THEN 'N' ELSE NULL END AS 是否可空
  47. , C.DefaultValue AS 默认值
  48. , H.Indexes AS 索引名称
  49. , C.ColumnId AS 列顺序
  50. FROM DBC.COLUMNS C -- 列元数据
  51. INNER JOIN DBC.TABLES T -- 表元数据
  52. ON T.DatabaseName = C.DatabaseName
  53. AND T.TableName = C.TableName
  54. AND T.TableKind = 'T'
  55. LEFT JOIN DBC.INDICES I -- 索引
  56. ON I.DatabaseName = C.DatabaseName
  57. AND I.TableName = C.TableName
  58. AND I.ColumnName = C.ColumnName
  59. AND I.INDEXTYPE = 'K' -- 限制为主键
  60. LEFT JOIN (
  61. /* If Teradata's XML-services are installed (default since 14.10?) there's a function named XMLAGG */
  62. SELECT DatabaseName, TableName, ColumnName
  63. , TRIM(TRAILING ',' FROM (XMLAGG(TRIM(ColumnName)|| ',' ORDER BY ColumnPosition) (VARCHAR(10000)))) AS Indexes
  64. FROM DBC.INDICES
  65. WHERE IndexName IS NOT NULL
  66. GROUP BY DatabaseName, TableName, ColumnName
  67. ) H
  68. ON I.DatabaseName = H.DatabaseName
  69. AND I.TableName = H.TableName
  70. AND I.ColumnName = H.ColumnName
  71. ORDER BY C.DatabaseName, C.TableName, C.ColumnId

数据库的元数据抽取SQL的更多相关文章

  1. SQL Server数据库性能优化之SQL语句篇【转】

    SQL Server数据库性能优化之SQL语句篇http://www.blogjava.net/allen-zhe/archive/2010/07/23/326927.html 近期项目需要, 做了一 ...

  2. Java数据库——使用元数据分析数据库

    在JDBC中提供了DatabaseMetaData和ResultSetMetaData接口来分析数据库的元数据. DatabaseMetaData 使用DatabaseMetaData取得数据库的元信 ...

  3. Atitit.并发测试解决方案(2) -----获取随机数据库记录 随机抽取数据 随机排序 原理and实现

    Atitit.并发测试解决方案(2) -----获取随机数据库记录 随机抽取数据 随机排序 1. 应用场景 1 2. 随机抽取数据原理 1 3. 常用的实现方法:::数据库随机函数 1 4. Mssq ...

  4. mysql 案例~mysql元数据的sql统计

    一 简介:今天我们来收集下提取元数据的sql 二 前沿: information_schema  引擎 memory 元数据收集表 三 sql语句: 1#没有使用索引的表统计 SELECT t.TAB ...

  5. 【Java/JDBC】借助ResultSetMetaData,从数据库表中抽取字段信息存成Excel文件

    本例工程下载:https://files.cnblogs.com/files/xiandedanteng/FindNotnullColumns20191102-3.rar 工作中曾有个为42张表建立测 ...

  6. laravel如何从mysql数据库中随机抽取n条数据

    laravel如何从mysql数据库中随机抽取n条数据 一.总结 一句话总结: inRandomOrder():$userQuestions=UserQuestion::where($map)-> ...

  7. TODO:从数据库中随机抽取一条记录

    TODO:从数据库中随机抽取一条记录 1.最直接,最粗暴的方法先计算记录的总数,然后选择一个从0到记录总数之间的随机数n,利用skip跳过n条记录,这是效率低下的的方法,首先的记录总数,在用skip会 ...

  8. 使用Red Gate Sql Compare 数据库同步工具进行SQL Server的两个数据库的结构比较、同步

    将测试版的项目同步(部署)到正式版的时候,两个数据库的结构比较与同步时,如果修改数据库的时候没有记录好修改了那些表,很难将两个数据库进行同步 RedGate Sql Compare使用简介说明: 1. ...

  9. SQL Azure (14) 将云端SQL Azure中的数据库备份到本地SQL Server

    <Windows Azure Platform 系列文章目录> 注意: 1.只有SQL Server 2012 CU4及以上版本才支持本章内容 2.当你的数据库文件很大时,建议优化以下内容 ...

随机推荐

  1. Windows7下命令行使用MySQL

    我在Win7下安装的MySQL版本是mysql-5.0.22-win32 1.在Win7环境下安装MySQL,关于安装方法可以参考文章: Win7系统安装MySQL5.5.21图解教程.win7安装M ...

  2. CM 安装cdh 版本及出现问题

    添加节点: 安装完cdh 后jps出现:process information unavailable 解决办法:

  3. 利用MySqlBulkLoader生成csv文件,批量添加数据

    DataTable dt = new DataTable(); dt.Columns.Add("Id", typeof(int)); dt.Columns.Add("Yw ...

  4. 关于windows和linux系统更换JDK版本后,修改环境变量也无法生效的原因和解决办法

    今天遇到了一个问题: 我linux系统之前安装JDK12,今天将其改成了JDK1.8,并修改了环境变量,但是通过java -version命令显示的依旧是JDK12的版本. 这是因为,当使用安装版本的 ...

  5. nginx 简单使用

    一,下载 http://nginx.org/en/download.html 这个是我下载的windows版本 二,解压后目录 三,修改配置文件 (由于80端口很可能被 SQL Server Repo ...

  6. 【学术篇】51nod 1238 最小公倍数之和

    这是一道杜教筛的入(du)门(liu)题目... 题目大意 求 \[ \sum_{i=1}^n\sum_{j=1}^nlcm(i,j) \] 一看就是辣鸡反演一类的题目, 那就化式子呗.. \[ \s ...

  7. js字符与ASCII码互转的方法

    大写字母A-Z对应的ASCII码值是65-90 小写字母a-z对应的ASCII码值是97-122 将字母转为ascii码的方法: 将ascii码转为对应字母的方法:

  8. 影响RAKsmart服务器稳定性的相关因素

    RAKsmart美国服务器近年来凭借着成熟的技术和性价比吸引着广大站长,那RAKsmart服务器稳定性怎么样呢?有什么影响因素呢?下面来了解一下吧. 因素一:服务器配置 服务器能正常运营是建立在服务器 ...

  9. http/tcp/ip/端口

    http是www服务器和本地浏览器之间传输超文本的协议. 每一台机器都有一个属于自己的ip地址,计算机也需要知道是哪个程序来接受信息,这里也就引入了端口号,可以简单地理解每一个程序都有一个唯一的端口号 ...

  10. SpringDataJpa实现自定义(更新)update语句

    SpringDataJpa的框架没有线程的更新方法,只能调用save()方法实行保存,如果是只更新一处的话,这个也不太适用.所以楼主尝试着自定义sql语句来写. service层 @Overridep ...