안녕하세요.
오늘은 (제 스타일의) ERD 작성시 Table / Column Comment 를 추출하는 쿼리 공유드리고자 합니다.
저희가 지원하는 서비스의 경우, Life Time 이 너무 짧아 ERD 를 꾸준히 관리하지는 못하지만,
초기 서비스를 시작할 때 관련담당자들(DB, DEV, DW, 사업PM)의 이해도를 높이기 위해 ERD 를 그리곤 합니다.
경험상 대부분의 모델링 도구들이 '한글' 또는 '영문'명만 표시해주면서 실제 코딩시 활용도가 낮은데,
"영문컬럼명 [한글정의]" 형태로 ERD 를 그림으로써 다소나마 가시성을 높여 사용하고 있습니다.
(생각해보니 DA# 에서 이런 형태로 보여주는 기능이 있네요. Padding 이 안되어 이쁘진 않지만... ㅎㅎ)
■ ERD 예제
■ 추출쿼리
=====================================
쿼리 Type
=====================================
select concat(rpad(column_name, a.start_no, ' '),'[',trim(b.column_comment),']') as col_desc
, b.table_schema, b.table_name, b.column_name, b.column_comment, a.start_no
from (select table_schema, table_name, max(length(column_name))+2 as start_no
from information_schema.columns
where table_schema not in ('information_schema','common_schema','mysql','performance_schema','ps_helper')
group by table_schema, table_name) a
, information_schema.columns b
where a.table_schema = b.table_schema
and a.table_name = b.table_name
order by b.table_schema, b.table_catalog, b.table_schema, b.table_name, b.ordinal_position;
show full columns from information_schema.columns;
=====================================
프로시져 Type
=====================================
use test;
DROP PROCEDURE IF EXISTS usp_show_table_desc;
delimiter //
CREATE PROCEDURE usp_show_table_desc()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE v_table_schema VARCHAR(50);
DECLARE v_table_name VARCHAR(50);
DECLARE v_max_length INT;
DECLARE cur1 CURSOR
FOR
select table_schema, table_name, max(length(column_name))+2 as max_length
from information_schema.columns
where table_schema not in ('information_schema','common_schema','mysql','performance_schema','ps_helper')
group by table_schema, table_name
order by table_schema, table_name;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur1;
read_loop:
LOOP
FETCH cur1 INTO v_table_schema, v_table_name, v_max_length;
-- select v_table_schema, v_table_name, v_max_length;
select "===============================================" as "___comments___"
union
select concat(table_name, ' [',trim(table_comment),']') as "___comments___"
from information_schema.tables
where table_schema = v_table_schema
and table_name = v_table_name
union all
select "==============================================="
union all
select concat(rpad(column_name, v_max_length, ' '),'[',trim(column_comment),']') as col_desc
from (
select column_name, column_comment
from information_schema.columns
where table_schema = v_table_schema
and table_name = v_table_name
order by ordinal_position
) x
union all
select "==============================================="
union all
select ""
union all
select "";
IF done = 1 THEN
LEAVE read_loop;
END IF;
END LOOP;
CLOSE cur1;
END
//
delimiter ;
call usp_show_table_desc();
-- shell 에서 실행
mysql -u root -p --skip-column-names -e "use test; call usp_show_table_desc();" > tab_col_desc.txt
-- Output 확인
vi tab_col_desc.txt
-------------------------------------------------------------------
...
===============================================
user_stage [유저별 스테이지 정보]
===============================================
usr_id [유저 고유번호]
stage_id [스테이지 고유번호]
stage_level [스테이지 현재등급]
wins [(누적) 승수]
kills [(누적) 킬수]
===============================================
...
-------------------------------------------------------------------
'연구개발 > MYSQL' 카테고리의 다른 글
[MySQL] sql_mode 설정 (0) | 2014.12.18 |
---|---|
'Access denied for user 'debian-sys-maint'@'localhost' (using password: YES)' (0) | 2014.12.18 |
InnoDB tablespace 구조 (0) | 2014.12.16 |
iostat의 %util 계산하는 방법 (0) | 2014.12.12 |
파티션 삭제시 Exchange Partition 기능 활용 (0) | 2014.12.11 |