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

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

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

-- 判断索引是否存在,不存在则创建索引
DROP PROCEDURE IF EXISTS add_index;
DELIMITER //
CREATE PROCEDURE add_index() BEGIN
DECLARE target_database VARCHAR(100);
DECLARE target_table_name VARCHAR(100);
DECLARE target_column_name VARCHAR(100);
DECLARE target_index_name VARCHAR(100);
set target_table_name = 'tb_user';
set target_column_name = 'account_pinyin';
set target_index_name = 'index_account_pinyin';
SELECT DATABASE() INTO target_database;
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
set @statement = CONCAT("ALTER TABLE ", target_table_name, " ADD INDEX ", target_index_name, "(", target_column_name, " ASC )");
PREPARE STMT FROM @statement;
EXECUTE STMT;
END IF;
END
//
DELIMITER ; -- 注意 DELIMITER 与分号之间有空格
CALL add_index();

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

-- 判断字段是否存在,不存在则增加
DROP PROCEDURE IF EXISTS add_column;
DELIMITER //
CREATE PROCEDURE add_column() BEGIN
DECLARE target_database VARCHAR(100);
DECLARE target_table_name VARCHAR(100);
DECLARE target_column_name VARCHAR(100);
DECLARE target_index_name VARCHAR(100);
set target_table_name = 'tb_user';
set target_column_name = 'new_column';
SELECT DATABASE() INTO target_database;
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
set @statement = CONCAT("ALTER TABLE ", target_table_name, " ADD COLUMN ", target_column_name, " VARCHAR(45) NULL");
PREPARE STMT FROM @statement;
EXECUTE STMT;
END IF;
END
//
DELIMITER ; -- 注意 DELIMITER 与分号之间有空格
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. Tomcat内存溢出解决方法

    Java内存溢出详解 一.常见的Java内存溢出有以下三种: 1. java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出 JVM在 ...

  2. Nginx的特性功能-反向代理、负载均衡、缓存、动静分离、平滑升级

    反向代理 nginx配置文件 events  {   }  事件驱动 httpd  {   }   关于httpd相关的配置 server {  }  定义虚拟主机 location {   }    ...

  3. sed命令配置反向引用

    比如反向引用的例子, 原日志如下: {"accessip_list":"::","method":"GET"," ...

  4. php一句话木马+中国菜刀拿服务器文件目录

    使用工具: 中国菜刀 一句话php木马 <?php @eval($_POST['123456']);?> 第一步,将php木马上传至服务器,为了方便我就直接在服务器上建立. [root@p ...

  5. PAT 乙级 1011.A+B 和 C C++/Java

    题目来源 给定区间 [−] 内的 3 个整数 A.B 和 C,请判断 A+B 是否大于 C. 输入格式: 输入第 1 行给出正整数 T (≤),是测试用例的个数.随后给出 T 组测试用例,每组占一行, ...

  6. RabbitMQ 的 docker 镜像使用

    RabbitMQ 的 docker 镜像使用 1.下载镜像(management版本的才带有web管理界面) docker pull rabbitmq:3.7.18-management 2.创建容器 ...

  7. PWA-让前端网页媲美原生APP的用户体验

    一.背景 从2018年到现在,作为号称下一代web应用模型的PWA,逐渐成为了一个各大前端厂商争先恐后进行涉足,布局的一个新的技术, 其主要的对标物Native app,作为现在最主流的mobile端 ...

  8. 高性能MySQL(一)——索引

    一.mysql索引分类 单值索引:一个索引只包含单个列,一个表可以有多个单列索引 唯一索引:索引列的值必须唯一,但允许有空值 复合索引:一个索引包含多个列 基本语法: 创建:1.CREATE [UNI ...

  9. Docker部署ngnix静态网站

    Hello World 首先获取ngnix镜像(默认的是最新版. docker pull nginx 先来编写一个最简单的Dockerfile,一个Dockerfile修改该Nginx镜像的首页 Do ...

  10. service里无法注入mapper,mapper空指针

    被困扰了一天,终于解决了,记录一下 下面是mapper的代码 @Mapper public interface ProductDao { @Select("select * from pro ...