【MySQL】定義情報をMarkdownで出すSQL(テーブル、INDEX)

テーブル定義書が欲しいと思いSQLでMarkdownを出力するようにしました。

ちなみに普通にテーブル定義書を出力するA5:SQL Mk-2というソフトがありますが、こちらはエクセルになります。


出力情報

  • テーブル定義
  • INDEX定義

必要に応じて機能を追加していきます。


SQL

使用方法は簡単です。

下記SQLを実行して出力結果がMarkdownなので貼り付けるだけ。

クライアントの結果によっては調整などが必要になるかも知れないのでご注意ください。

-- Mysql テーブル、INDEX定義マークダウン出力
SELECT
  CONCAT( 
    COLUMN_NAME
    , COLUMN_DEFAULT
    , IS_NULLABLE
    , COLUMN_TYPE
    , COLUMN_KEY
    , EXTRA
    , COLUMN_COMMENT
  ) AS Markdown 
FROM
  ( 
    SELECT
      '' AS TABLE_NAME
      , CONCAT('\r\n# ', schema_name) AS COLUMN_NAME
      , '' AS COLUMN_DEFAULT
      , '' AS IS_NULLABLE
      , '' AS COLUMN_TYPE
      , '' AS COLUMN_KEY
      , '' AS EXTRA
      , '' AS COLUMN_COMMENT
      , '-99' AS ORDINAL_POSITION 
    FROM
      information_schema.schemata 
    WHERE
      schema_name = database() 
    UNION ALL 
    SELECT
      TABLE_NAME
      , CONCAT('\r\n## ', TABLE_NAME) AS COLUMN_NAME
      , IF(LENGTH(TABLE_COMMENT) > 0, CONCAT('(', TABLE_COMMENT, ')'), '' ) AS COLUMN_DEFAULT
      , '\r\n### テーブル定義' AS IS_NULLABLE
      , '' AS COLUMN_TYPE
      , '' AS COLUMN_KEY
      , '' AS EXTRA
      , '' AS COLUMN_COMMENT
      , '-2' AS ORDINAL_POSITION 
    FROM
      information_schema.tables 
    WHERE
      table_schema = database() 
    UNION ALL 
    SELECT
      TABLE_NAME
      , '| 列名 ' AS COLUMN_NAME
      , '| デフォルト ' AS COLUMN_DEFAULT
      , '| NULL ' AS IS_NULLABLE
      , '| 型 ' AS COLUMN_TYPE
      , '| キー ' AS COLUMN_KEY
      , '| その他 ' AS EXTRA
      , '| コメント ' AS COLUMN_COMMENT
      , '-1' AS ORDINAL_POSITION 
    FROM
      information_schema.tables 
    WHERE
      table_schema = database() 
    UNION ALL 
    SELECT
      TABLE_NAME
      , '|---' AS COLUMN_NAME
      , '|---' AS COLUMN_DEFAULT
      , '|---' AS IS_NULLABLE
      , '|---' AS COLUMN_TYPE
      , '|---' AS COLUMN_KEY
      , '|---' AS EXTRA
      , '|---|' AS COLUMN_COMMENT
      , '0' AS ORDINAL_POSITION 
    FROM
      information_schema.tables 
    WHERE
      table_schema = database() 
    UNION ALL 
    SELECT
      TABLE_NAME
      , CONCAT('| ', COLUMN_NAME)
      , CONCAT('| ', IFNULL(COLUMN_DEFAULT, ''))
      , CONCAT('| ', IS_NULLABLE)
      , CONCAT('| ', COLUMN_TYPE)
      , CONCAT('| ', COLUMN_KEY)
      , CONCAT('| ', EXTRA)
      , CONCAT('| ', COLUMN_COMMENT, '|')
      , ORDINAL_POSITION 
    FROM
      information_schema.columns 
    WHERE
      table_schema = database() 
    UNION ALL 
    SELECT
      DISTINCT
      TABLE_NAME
      , '\r\n### INDEX情報\r\n| INDEX名 ' AS COLUMN_NAME
      , '| INDEX列 ' AS COLUMN_DEFAULT
      , '| UNIQUE ' AS IS_NULLABLE
      , '|コメント |' AS COLUMN_TYPE
      , '' AS COLUMN_KEY
      , ' ' AS EXTRA
      , '' AS COLUMN_COMMENT
      , '1001' AS ORDINAL_POSITION 
    FROM
      information_schema.statistics 
    WHERE
      table_schema = database() 
    UNION ALL 
    SELECT
      DISTINCT
      TABLE_NAME
      , '|---' AS COLUMN_NAME
      , '|---' AS COLUMN_DEFAULT
      , '|---' AS IS_NULLABLE
      , '|---|' AS COLUMN_TYPE
      , '' AS COLUMN_KEY
      , '' AS EXTRA
      , '' AS COLUMN_COMMENT
      , '1002' AS ORDINAL_POSITION 
    FROM
      information_schema.statistics 
    WHERE
      table_schema = database() 
    UNION ALL 
    SELECT
      TABLE_NAME
      , CONCAT('| ', INDEX_NAME) AS COLUMN_NAME
      , CONCAT( 
        '| '
        , GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX)
      ) AS COLUMN_DEFAULT
      , CONCAT('| ', IF (NON_UNIQUE = 0, 'UNIQUE', '')) AS IS_NULLABLE
      , CONCAT('| ', COMMENT, '|') AS COLUMN_TYPE
      , '' AS COLUMN_KEY
      , '' AS EXTRA
      , '' AS COLUMN_COMMENT
      , '1003' AS ORDINAL_POSITION 
    FROM
      information_schema.statistics 
    WHERE
      table_schema = database() 
    GROUP BY
      TABLE_NAME
      , INDEX_NAME
  ) temp 
ORDER BY
  TABLE_NAME
  , CAST(ORDINAL_POSITION AS SIGNED);

出力結果

こちらが出力結果になります。

サンプルとしてMysql公式のサンプルのworldDBで使用した出力結果になります。

# world

## city
### テーブル定義
| 列名 | デフォルト | NULL | 型 | キー | その他 | コメント 
|---|---|---|---|---|---|---|
| ID| | NO| int(11)| PRI| auto_increment| |
| Name| | NO| char(35)| | | |
| CountryCode| | NO| char(3)| MUL| | |
| District| | NO| char(20)| | | |
| Population| 0| NO| int(11)| | | |

### INDEX情報
| INDEX名 | INDEX列 | UNIQUE |コメント | 
|---|---|---|---|
| CountryCode| CountryCode| | |
| PRIMARY| ID| UNIQUE| |

## country
### テーブル定義
| 列名 | デフォルト | NULL | 型 | キー | その他 | コメント 
|---|---|---|---|---|---|---|
| Code| | NO| char(3)| PRI| | |
| Name| | NO| char(52)| | | |
| Continent| Asia| NO| enum('Asia','Europe','North America','Africa','Oceania','Antarctica','South America')| | | |
| Region| | NO| char(26)| | | |
| SurfaceArea| 0.00| NO| decimal(10,2)| | | |
| IndepYear| | YES| smallint(6)| | | |
| Population| 0| NO| int(11)| | | |
| LifeExpectancy| | YES| decimal(3,1)| | | |
| GNP| | YES| decimal(10,2)| | | |
| GNPOld| | YES| decimal(10,2)| | | |
| LocalName| | NO| char(45)| | | |
| GovernmentForm| | NO| char(45)| | | |
| HeadOfState| | YES| char(60)| | | |
| Capital| | YES| int(11)| | | |
| Code2| | NO| char(2)| | | |

### INDEX情報
| INDEX名 | INDEX列 | UNIQUE |コメント | 
|---|---|---|---|
| PRIMARY| Code| UNIQUE| |

## countrylanguage
### テーブル定義
| 列名 | デフォルト | NULL | 型 | キー | その他 | コメント 
|---|---|---|---|---|---|---|
| CountryCode| | NO| char(3)| PRI| | |
| Language| | NO| char(30)| PRI| | |
| IsOfficial| F| NO| enum('T','F')| | | |
| Percentage| 0.0| NO| decimal(4,1)| | | |

### INDEX情報
| INDEX名 | INDEX列 | UNIQUE |コメント | 
|---|---|---|---|
| CountryCode| CountryCode| | |
| PRIMARY| CountryCode,Language| UNIQUE| |

0 件のコメント :

コメントを投稿