使用存储过程可以保证数据库升级脚本可以重复执行而不会报错。

  1. CREATE TABLE `tb_user` (
  2. `id` bigint(20) NOT NULL COMMENT '非自增id',
  3. `account` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
  4. `account_pinyin` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'account的拼音,用于account排序。',
  5. `password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
  6. `salt` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '盐值',
  7. `mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '手机号,不可为null,默认值为'''',可用于登录',
  8. `email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '邮箱,不可为null,默认值为'''',可用于登录',
  9. `deleted` tinyint(1) NOT NULL DEFAULT '' COMMENT '用户是否删除。0:未删除;1:删除',
  10. `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  11. `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  12. PRIMARY KEY (`id`),
  13. UNIQUE KEY `unique_account` (`account`),
  14. UNIQUE KEY `unique_mobile` (`mobile`),
  15. UNIQUE KEY `unique_email` (`email`),
  16. KEY `index_updated_at` (`updated_at`),
  17. KEY `index_account_pinyin` (`account_pinyin`)
  18. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

1、存储过程判断索引是否存在

  1. -- 判断索引是否存在,不存在则创建索引
  2. DROP PROCEDURE IF EXISTS add_index;
  3. DELIMITER //
  4. CREATE PROCEDURE add_index() BEGIN
  5. DECLARE target_database VARCHAR(100);
  6. DECLARE target_table_name VARCHAR(100);
  7. DECLARE target_column_name VARCHAR(100);
  8. DECLARE target_index_name VARCHAR(100);
  9. set target_table_name = 'tb_user';
  10. set target_column_name = 'account_pinyin';
  11. set target_index_name = 'index_account_pinyin';
  12. SELECT DATABASE() INTO target_database;
  13. IF NOT EXISTS (SELECT * FROM information_schema.statistics WHERE table_schema = target_database AND table_name = target_table_name AND index_name = target_index_name) THEN
  14. set @statement = CONCAT("ALTER TABLE ", target_table_name, " ADD INDEX ", target_index_name, "(", target_column_name, " ASC )");
  15. PREPARE STMT FROM @statement;
  16. EXECUTE STMT;
  17. END IF;
  18. END
  19. //
  20. DELIMITER ; -- 注意 DELIMITER 与分号之间有空格
  21. CALL add_index();

2、存储过程判断字段是否存在

  1. -- 判断字段是否存在,不存在则增加
  2. DROP PROCEDURE IF EXISTS add_column;
  3. DELIMITER //
  4. CREATE PROCEDURE add_column() BEGIN
  5. DECLARE target_database VARCHAR(100);
  6. DECLARE target_table_name VARCHAR(100);
  7. DECLARE target_column_name VARCHAR(100);
  8. DECLARE target_index_name VARCHAR(100);
  9. set target_table_name = 'tb_user';
  10. set target_column_name = 'new_column';
  11. SELECT DATABASE() INTO target_database;
  12. IF NOT EXISTS (SELECT * FROM information_schema.columns WHERE table_schema = target_database AND table_name = target_table_name AND column_name = target_column_name) THEN
  13. set @statement = CONCAT("ALTER TABLE ", target_table_name, " ADD COLUMN ", target_column_name, " VARCHAR(45) NULL");
  14. PREPARE STMT FROM @statement;
  15. EXECUTE STMT;
  16. END IF;
  17. END
  18. //
  19. DELIMITER ; -- 注意 DELIMITER 与分号之间有空格
  20. CALL add_column();

有问题欢迎留言交流。

技术交流群:282575808

--------------------------------------

声明: 原创文章,未经允许,禁止转载!

--------------------------------------

MySQL使用存储过程实现判断表中字段或者索引是否存在,如果不存在则创建的更多相关文章

  1. SQL Server 判断表中是否存在某字段

    功能:判断表中是否存在某字段,若不存在,则新增该字段 语句: IF NOT EXIST (SELECT 1 FROM [DATABASE].[SCHEMA].SYSCOLUMNS WHERE ID=O ...

  2. 修改MySQL数据库中表和表中字段的编码方式的方法

    今天向MySQL数据库中的一张表添加含有中文的数据,可是老是出异常,检查程序并没有发现错误,无奈呀,后来重新检查这张表发现表的编码方式为latin1并且原想可以插入中文的字段的编码方式也是latin1 ...

  3. 如何使用MySQL一个表中的字段更新另一个表中字段

    [本文出自:https://www.jb51.net/article/150323.htm] 这篇文章主要介绍了如何使用MySQL一个表中的字段更新另一个表中字段,需要的朋友可以参考下 1,修改1列 ...

  4. MySQL修改表中字段的字符集

    MySQL修改表中字段的字符集 ALTER TABLE 表名 MODIFY 字段名 要修改的属性: 例:ALTER TABLE `guaduates` MODIFY `studentno` CHAR( ...

  5. Oracle删除表、字段之前判断表、字段是否存在

    这篇文章主要介绍了Oracle删除表.字段之前判断表.字段是否存在的相关资料,需要的朋友可以参考下 在Oracle中若删除一个不存在的表,如 “DROP TABLE tableName”,则会提示: ...

  6. SQL 把表中字段存储的逗号隔开内容转换成列表形式

    原文:[原创]SQL 把表中字段存储的逗号隔开内容转换成列表形式 我们日常开发中,不管是表设计问题抑或是其他什么原因,或多或少都会遇到一张表中有一个字段存储的内容是用逗号隔开的列表. 具体效果如下图: ...

  7. KO ------- 表中字段名和实体类属性名不一致

    -----------------------siwuxie095 KO ------- 表中字段名和实体类属性名不一致 如果数据库表中的字段名和实体类的属性名不一致,那么在查询时, 相应字段的结果就 ...

  8. SqlServer判断表中某列是否包含中文,英文,纯数字

    原文:SqlServer判断表中某列是否包含中文,英文,纯数字 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog ...

  9. SQL批量更新数据库中所有用户数据表中字段类型为tinyint为int

    --SQL批量更新数据库中所有用户数据表中字段类型为tinyint为int --关键说明:--1.从系统表syscolumns中的查询所有xtype='48'的记录得到类型为[tinyint]的字段- ...

随机推荐

  1. python笔记--------二

    tolist()方法: 列表可通过array()转换为数组或mat()转为矩阵 而tolist()可把数组对象或矩阵对象转为列表 数组对象: array([[1, 2, 3], [1, 2, 3]]) ...

  2. 提高用git下载代码时的成功率

    在用git clone下载一些比较大的仓库时,经常会遇到由于仓库体积过大,网络也不稳定,导致下了半截就中断了,可以参考如下的下载方法. 先用创建一个空目录,然后用git init初始化,然后用git ...

  3. CentOS6.7搭建部署DNS服务 (详解主配置文件)

    -DNS服务器的基本原理 域名简介:使用tcp/udp协议,默认使用53端口号 默认情况下,客户端发起的查询请求都是用UDP/53查询的. 默认情况下,从从服务器到主服务器传输数据用的是TCP/53. ...

  4. zabbix--显示插件Graphtree

    zabbix配置显示插件Graphtree 网盘下载地址:https://pan.baidu.com/s/1HGALOq2z7XiVRxyb6ASAeQ   提取码:13vn Graphtree 安装 ...

  5. ThinkCMF_X1.6.0-X2.2.3框架任意内容包含漏洞的简单分析复现(附自动化验证脚本)

    1.漏洞概述 攻击者可利用此漏洞构造恶意的url,向服务器写入任意内容的文件,达到远程代码执行的目的 2.影响版本 ThinkCMF X1.6.0 ThinkCMF X2.1.0 ThinkCMF X ...

  6. httprunner学习11-辅助函数debugtalk.py

    前言 在httprunner里面,每个 YAML / JSON 文件的脚本都是独立运行的,有时候我们希望能跨文件使用公用的参数. 比如登录生成一个token,后面的用例都可以去引用这个token值,或 ...

  7. DT系统应用-添加地图标注

    修改方法:修改模板->Homepage->contact.htm 在 {php $map_height = 300;} {php @include DT_ROOT.'/api/map/'. ...

  8. 运维常用shell脚本之日志清理

    1.创建一个日志清理脚本 #/bin/bash for i in `find /root/.pm2/logs -name "*.log"` do cat /dev/null > ...

  9. 封装好的cookie的三个常用函数 cookie的添加、删除、提取操作函数

    function addCookie(name,value,expiresHours){   //添加一个cookie.  三个参数:cookie的名称.值.有效时间(为0时,关闭浏览器cookie消 ...

  10. 客户端本地存储,web存储,localStorage

    HTML5 LocalStorage 本地存储 说到本地存储,这玩意真是历尽千辛万苦才走到HTML5这一步,之前的历史大概如下图所示: 最早的Cookies自然是大家都知道,问题主要就是太小,大概也就 ...