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

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

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

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

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

最新文章

  1. Spring MVC静态资源处理(在applicationContex.xml文件中进行配置)
  2. 请求转发(Forward)和重定向(Redirect)的区别
  3. ajax请求、servlet返回json数据
  4. 【总结】你所不知道的Java序列化
  5. Visual Studio 扩展包(.vsix)制作
  6. Memcached解决单台服务器故障问题
  7. 【开发记录】iOS中使用 Reachability 检测网络
  8. homework -06 围棋
  9. 十一招解决:系统IE部分网页打不开怎么办(转载)
  10. ios 中Category类别(扩展类)小结
  11. [Sdoi2009]Elaxia的路线
  12. centos7系统下搭建docker本地镜像仓库
  13. MATLAB 通过对话框返回值选择下一步操作
  14. 〖Android〗我的ADT Eclipse定制
  15. 环形数组 最大子段和 dp
  16. Web应用的统一异常处理(二十四)
  17. 【Tomcat】tomcat热部署和热加载(转载)
  18. golang笔记(1)-数据库查询结果映射至结构体
  19. 20155330 2016-2017-2 《Java程序设计》第九周学习总结
  20. 【BZOJ 1019】 1019: [SHOI2008]汉诺塔 (DP?)

热门文章

  1. tensorflow--非线性回归
  2. PySpark DataFrame 添加自增 ID
  3. Cobbler本机使用VM装机配置方法
  4. LoarRunner脚本录制-Port Mapping
  5. pandas的pivot_table
  6. seaborn---调色板
  7. 2019年杭电多校第一场 1009题String(HDU6586+模拟+单调栈)
  8. Educational Codeforces Round 65 (Rated for Div. 2)题解
  9. JUnit 4.x 知识点
  10. nuxt build 项目文件分析、nuxt build 发布后的资源如何部署cdn