设为首页 收藏本站
查看: 562|回复: 0

[经验分享] 获取MySQL5.5表元信息

[复制链接]

尚未签到

发表于 2018-10-1 11:26:40 | 显示全部楼层 |阅读模式
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


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-607080-1-1.html 上篇帖子: mysql添加外网访问权限 下篇帖子: mysql 添加第N个从库
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表