最近,在写一个代码工具,从数据读取表生成实体Bean、SQLMap,需要获取到数据库的元信息,为了适应不同的数据库,需要针对每一种数据库实现一种获取元信息的方式,这里是MySQL5.5元信息的获取方式:
 
1、获取一个数据库下面所有的表
SELECT t.table_name,t.table_comment,t.create_time, 
FROM information_schema.tables t 
WHERE t.table_schema =  SCHEMA();
 
2、获取一个表的元信息
SELECT t.column_name, 
             t.data_type, 
              CAST(SUBSTR(t.column_type, INSTR(t.column_type,  '(') + 1, INSTR(t.column_type, ')') - INSTR(t.column_type,  '(') - 1)  AS  CHAR(20)) data_length, 
              CAST(t.column_type  AS  CHAR(20)) column_type, 
             t.column_comment, 
              IF (t.is_nullable= 'YES',1,0) is_nullable, 
              IF (t.column_key =  'PRI', 1, 0) is_key 
FROM information_schema.columns t 
WHERE t.table_schema =  SCHEMA()  AND 
            t.table_name =  '表名' 
ORDER  BY t.ordinal_position;
 
3、获取一个表的建表语句
SHOW  CREATE  TABLE 表名;
 
或者另外一种方式:
CREATE    FUNCTION `get_tab_ddl`(p_tab_name  VARCHAR(100)) RETURNS  text    
        NO SQL 
        DETERMINISTIC 
BEGIN 
     DECLARE v_return  TEXT  DEFAULT  ''
     DECLARE v_ddl  TEXT  DEFAULT  ''
     
    #表信息相关变量 
     DECLARE v_engine  VARCHAR(255); 
     DECLARE v_row_format  VARCHAR(255); 
     DECLARE v_tab_comment  VARCHAR(255); 
    #约束相关变量 
     DECLARE v_cons_name  VARCHAR(255); 
     DECLARE v_cons_type  VARCHAR(255); 
     
    #约束列相关变量 
     DECLARE v_cons_col_name  VARCHAR(255); 
     DECLARE v_ref_tab_schema  VARCHAR(255); 
     DECLARE v_ref_tab_name  VARCHAR(255); 
     DECLARE v_ref_col_name  VARCHAR(255); 
     DECLARE v_update_rule     VARCHAR(255); 
     DECLARE v_delete_rule     VARCHAR(255); 
    #索引相关变更 
     DECLARE v_index_name  VARCHAR(255); 
     DECLARE v_l_index_name  VARCHAR(255)  DEFAULT  ''
     DECLARE v_ind_col_name  VARCHAR(255); 
     
     DECLARE v_done  INT  DEFAULT 0; 
     
    #列游标 
     DECLARE cur_column  CURSOR  FOR    
             SELECT CONCAT( '    ', '`',t.column_name, '` ',column_type, 
              IF(t.is_nullable =  'NO', ' NOT NULL', ''), 
              IF(t.extra  IS  NULL, '',CONCAT( ' ',t.extra)), 
              IF(t.column_default  IS  NULL, '',CONCAT( ' ', 'DEFAULT ' , " '" , t.column_default , "'")), 
              IF(t.column_comment =  '', '',CONCAT( ' ', 'COMMENT ' , " '" , t.column_comment , "'")), ',') tab_column 
             FROM information_schema.columns t 
          WHERE t.table_schema =  SCHEMA() 
              AND t.table_name = p_tab_name 
             ORDER  BY t.ordinal_position; 
    #主键约束 
     DECLARE cur_pk  CURSOR  FOR    
          SELECT t.column_name 
              FROM information_schema.key_column_usage t 
             WHERE t.table_schema =  SCHEMA() 
                 AND t.table_name = p_tab_name 
                 AND t.constraint_name =  'PRIMARY' 
              ORDER  BY t.ordinal_position; 
    #其它约束游标 
     DECLARE cur_cons  CURSOR  FOR    
          SELECT t.constraint_type,t.constraint_name 
              FROM information_schema.table_constraints t 
             WHERE t.table_schema =  SCHEMA() 
                 AND t.table_name = p_tab_name 
                 AND t.constraint_type <>  'PRIMARY KEY'
    #约束列游标 
     DECLARE cur_col_cons  CURSOR  FOR    
          SELECT t.column_name,t.referenced_table_schema,t.referenced_table_name,t.referenced_column_name,c.update_rule,c.delete_rule 
              FROM information_schema.key_column_usage t 
             LEFT  JOIN information_schema.referential_constraints c  ON (t.table_name = c.table_name  AND t.constraint_name = c.constraint_name) 
             WHERE t.table_schema =  SCHEMA() 
                 AND t.table_name = p_tab_name 
                 AND t.constraint_name = v_cons_name 
              ORDER  BY t.ordinal_position; 
    #表上索引游标 
     DECLARE cur_index  CURSOR  FOR    
          SELECT t.index_name,t.column_name 
              FROM information_schema. statistics t 
             WHERE t.table_schema =  SCHEMA() 
                 AND t.table_name = p_tab_name 
                 AND  NOT  EXISTS ( SELECT 1  FROM information_schema.table_constraints c 
                                                  WHERE t.table_schema = c.table_schema 
                                                      AND t.table_name = c.table_name 
                                                      AND t.index_name = c.constraint_name) 
             ORDER  BY t.index_name,t.seq_in_index; 
         
     DECLARE  CONTINUE HANDLER  FOR SQLSTATE  '02000'  SET v_done=1;    
        #表信息 
         SELECT  IF(t.engine =  ''  OR t.engine  IS  NULL, '',CONCAT( ' ENGINE=',t.engine)) ENGINE, 
                     t.row_format, 
                      IF(t.table_comment =  ''  OR t.table_comment  IS  NULL, '',CONCAT(" COMMENT= '",t.table_comment,"'")) table_comment 
                      INTO v_engine,v_row_format,v_tab_comment 
             FROM information_schema.tables t 
         WHERE t.table_schema =  SCHEMA() 
             AND t.table_name = p_tab_name;     
     
     
      SET v_return = CONCAT( 'CREATE TABLE `',p_tab_name, '` (', CHAR(13)); 
        
        
     #打开列游标 
      OPEN cur_column; 
      FETCH cur_column  INTO v_ddl; 
        
      WHILE v_done <> 1 DO 
        
             SET v_return = CONCAT(v_return,v_ddl, CHAR(13)); 
             
             FETCH cur_column  INTO v_ddl; 
             
      END  WHILE;    
      CLOSE cur_column; 
      SET v_ddl =  ''
        
     #打开主键约束 
      SET v_done = 0; 
      OPEN cur_pk ; 
      FETCH cur_pk  INTO v_cons_col_name; 
      WHILE v_done <> 1 DO    
              SET v_ddl = CONCAT(v_ddl, '`',v_cons_col_name, '`,'); 
              FETCH cur_pk  INTO v_cons_col_name; 
      END  WHILE
      CLOSE cur_pk; 
      IF v_ddl <>  ''  THEN    
             SET v_return = CONCAT(v_return, '    ', 'PRIMARY KEY (', LEFT(v_ddl,CHAR_LENGTH(v_ddl) - 1), '),', CHAR(13)); 
      END  IF
        
      SET v_return = CONCAT( LEFT(v_return,CHAR_LENGTH(v_return) - 2), CHAR(13)); 
      SET v_return = CONCAT(v_return, ') ',v_engine,v_tab_comment, ' ;', CHAR(13)); 
     #打开其它约束游标 
      SET v_done = 0; 
      OPEN cur_cons; 
      FETCH cur_cons  INTO v_cons_type,v_cons_name; 
      WHILE v_done <> 1 DO    
              IF v_cons_type =  'FOREIGN KEY'  THEN    
                     SET v_return = CONCAT(v_return, CHAR(13), 'ALTER TABLE `',p_tab_name, '` ADD CONSTRAINT `',v_cons_name, '` FOREIGN KEY ('); 
                    #打开外键约束列游标 
                     OPEN cur_col_cons; 
                     FETCH cur_col_cons  INTO v_cons_col_name,v_ref_tab_schema,v_ref_tab_name,v_ref_col_name,v_update_rule ,v_delete_rule; 
                     WHILE v_done <> 1 DO 
                             SET v_return = CONCAT(v_return, '`',v_cons_col_name, '`) REFERENCES `',v_ref_tab_name, '` (`',v_ref_col_name, '`) '
                                                                         'ON DELETE ',v_delete_rule, ' ON UPDATE ',v_update_rule); 
                             FETCH cur_col_cons  INTO v_cons_col_name,v_ref_tab_schema,v_ref_tab_name,v_ref_col_name,v_update_rule ,v_delete_rule;         
        
                     END  WHILE
                     CLOSE cur_col_cons; 
                     SET v_return = CONCAT(v_return, ';', CHAR(13)); 
                  ELSE    
                     SET v_return = CONCAT(v_return, CHAR(13), 'ALTER TABLE `',p_tab_name, '` ADD CONSTRAINT `',v_cons_name, '` UNQINE ('); 
                    #打开唯一约束列游标 
                     OPEN cur_col_cons; 
                     FETCH cur_col_cons  INTO v_cons_col_name,v_ref_tab_schema,v_ref_tab_name,v_ref_col_name,v_update_rule ,v_delete_rule; 
                     WHILE v_done <> 1 DO 
                             SET v_return = CONCAT(v_return, '`',v_cons_col_name, '`,'); 
                             FETCH cur_col_cons  INTO v_cons_col_name,v_ref_tab_schema,v_ref_tab_name,v_ref_col_name,v_update_rule ,v_delete_rule;                
                     END  WHILE
                     CLOSE cur_col_cons; 
                     SET v_return = CONCAT( LEFT(v_return,CHAR_LENGTH(v_return) - 1), ');', CHAR(13)); 
              END  IF
              SET v_done = 0; 
              FETCH cur_cons  INTO v_cons_type,v_cons_name; 
      END  WHILE;    
      CLOSE cur_cons; 
     #打开索引游标 
      SET v_done = 0; 
      SET v_ddl =  ''
        
      OPEN cur_index; 
      FETCH cur_index  INTO v_index_name,v_ind_col_name; 
      WHILE v_done <> 1 DO                
             IF v_index_name = v_l_index_name  THEN    
                  SET v_ddl = CONCAT(v_ddl, '`',v_ind_col_name, '`,'); 
            ELSEIF v_l_index_name  IS  NULL  OR v_l_index_name =  ''  THEN    
                  SET v_ddl = CONCAT(v_ddl, CHAR(13), 'CREATE INDEX `',v_index_name, '` ON `',p_tab_name, '` (`',v_ind_col_name, '`,'); 
                 ELSE    
                      SET v_ddl = CONCAT( LEFT(v_ddl,CHAR_LENGTH(v_ddl) - 1), ');', CHAR(13), CHAR(13), 'CREATE INDEX `'
                                                                 v_index_name, '` ON `',p_tab_name, '` (`',v_ind_col_name, '`,'); 
             END  IF
                
             SET v_l_index_name = v_index_name; 
             FETCH cur_index  INTO v_index_name,v_ind_col_name; 
      END  WHILE;        
      CLOSE cur_index; 
      IF v_ddl <>  ''  THEN 
            
          SET v_return = CONCAT(v_return, LEFT(v_ddl,CHAR_LENGTH(v_ddl) - 1), ');', CHAR(13));                         
     
      END  IF
                                                     
     RETURN v_return; 
     
END