テーブル定義書が欲しいと思い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 件のコメント :
コメントを投稿