Mysql表结构升级_mysql表结构升级时根据字段是否存在执行相应操作
【问题描述】
某信息系统,使用MYSQL做数据库服务,版本5.0.45,在准备对表结构进行升级时,使用sql脚本对表结构进行更改,包括增加列、更改列等操作,为防止重复运行升级脚本而出现错误,拟在进行alter table 之前检测某一字段是否存在,如:
1、添加列,则要检测该列是否存在,如果不存在才进行add操作,否则不执行任何操作;
2、更改列,检测该列是否存在,如果存在则更新,否则添加该列;
3、删除列,检测该列是否存在,存在才执行操作
【初步实现方法】
1、编写自定义函数,检测某个表或某个字段是否存在,从系统数据库 `information_schema`.`COLUMNS` 里查询
2、编写存储过程,在其中调用该函数查询某表或某表的某字段是否存在,并根据查询结果执行操作
【代码示例】
[code=SQL]
DELIMITER $$
DROP FUNCTION IF EXISTS `db_waasai`.`CheckIsObjectExist`$$
CREATE FUNCTION `db_waasai`.`CheckIsObjectExist`(table_name VARCHAR(50),colume_name varchar(50))
RETURNS BOOLEAN
BEGIN
DECLARE t_count TINYINT UNSIGNED;
SELECT count(0) INTO t_count FROM information_schema.COLUMNS where TABLE_NAME=table_name && (isnull(colume_name) || colume_name= ' ' || COLUMN_NAME=colume_name);
RETURN t_count> 0;
END$$
DROP PROCEDURE if EXISTS `db_waasai`.`sp_update_106_107` $$
CREATE PROCEDURE `db_waasai`.`sp_update_106_107`()
BEGIN
IF NOT CheckIsObjectExist( 'tbl_user_card ', ' ') THEN
CREATE TABLE `tbl_user_card` (
`u_id` SMALLINT(6) UNSIGNED NOT NULL AUTO_INCREMENT,
`u_status` TINYINT(1) UNSIGNED DEFAULT '0 ',
`u_name` VARCHAR(20) NOT NULL,
PRIMARY KEY (`u_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC;
END IF;
IF NOT CheckIsObjectExist( 'tbl_user ', 'u_cards_num ') THEN
alter table `tbl_user` add column `u_cards_num` int (12) UNSIGNED DEFAULT '0 ' NULL after `u_age`;
update `tbl_user` set `u_cards_num`=1;
END IF;
END$$
DELIMITER ;
CALL sp_update_106_107();
DROP PROCEDURE IF EXISTS `lsgw`.`sp_update_106_107`;
[/code]
【引玉】
这只是我实现目的的方法,之前也尝试过用 if exists 之类的,但是始终没有成功,希望有朋友能够提供更简单、高效的方法
【说明】
示例代码是根据实际运行成功的代码改写的,并不保证完全可用,hoho
修改了下,支持UBB
[code=SQL]
DELIMITER $$
DROP FUNCTION IF EXISTS `db_waasai`.`CheckIsObjectExist`$$
CREATE FUNCTION `db_waasai`.`CheckIsObjectExist`
Mysql表结构升级_mysql表结构升级时根据字段是否存在执行相应操作相关推荐
- mysql 表结构关系_mysql 表关系 与 修改表结构
mysql 表关系 与 修改表结构 两张表关系 多对一 以员工和部门举例 多个员工对应一个部门 foreign key 永远是在多的那张表中设置外键 """ 从左边的表思 ...
- mysql表结构定义_Mysql表结构定义及相关语法
mysql语法及相关命令 1.每个sql命令都需要使用分号来完成 2.可以将一个命令写成多行 3.可以通过\c来取消本行命令 4.可以通过\g.exit.ctrl+c或者quit来退出当前客户端 5. ...
- mysql表结构定义_mysql 表结构及基本操作
说明在mysql语句中,sql语句总共分四种 a.DDL数据定义语句=>常用的ddl语句有(CREATE[创建],DROP[删除],ALTER[修改表结构]) b.DML数据操作语句=>常 ...
- mysql查看表结构修改记录表_MySQL 表结构查看以及表结构修改
使用MySql数据库时,如果对表字典不够熟悉,我们就需要查看表结构.如果数据库是在远程linux上部署,很多时候我们只能通过mysql的命令来查看表结构.同样,如果我们想要修改表结构,添加.删除.修改 ...
- mysql中修改表结构语法_MySQL表结构修改详解
MySQL修改表的语法 ========================= 增加列[add 列名] ========================= ①alter table 表名 add 列名 列 ...
- mysql 表空间收缩_mysql表碎片清理和表空间收缩
mysql表碎片清理和表空间收缩(即清理碎片后report_site_day.ibd文件磁盘空间减小,该方案基于独立表空间存储方式) OPTIMIZETABLE [tablename],当然这种方式只 ...
- mysql表和表的关系_mysql表与表之间建关系
2.浪费硬盘空间 3.扩展性极差 上述的弊端产生原因类似于把代码全部写在一个py文件中,应该怎么做? >> 解耦合! 将上述两张表拆成员工的部门两张表 分析表数据之间的关系:多个员工对应 ...
- mysql BDB支持表锁吗_mysql 表锁问题
本文转自:http://www.cnblogs.com/itdragon/p/8194622.html MySQL 表锁和行锁机制 行锁变表锁,是福还是坑?如果你不清楚MySQL加锁的原理,你会被它整 ...
- mysql表不存在_MySQL表不存在。 但它确实(或它应该)
MySQL>表不存在. 但它确实(或它应该) 我确实更改了MySQL安装的datadir,并按照一些步骤运行正常. 我所拥有的每个基地都正确地移动了一个. 我可以连接和使用数据库,甚至SHOW ...
最新文章
- 高版本linux安装gamit,求助(Ubuntu14.1上安装GAMIT10.5过程中错误提示如下)
- 接收服务器显示帧控制错误,Websocket连接关闭,出现错误“接收到意外的继续帧”...
- 阿里排查Java问题工具清单!
- 讨论下 Java 流文件读写缓存大小设置的问题
- javascript map 排序_数据结构-JavaScript字典结构的编程实现
- Apache Jmeter 压测入门
- C++ p63作业 2
- Linux开机自动启动软件/可执行程序方法
- php 赋值给 dom对象,详解PHP原生DOM对象操作XML的方法
- python指定时间范围数据_Python提取特定时间段内数据的方法实例
- Bootstrap(5)栅格系统
- 小明开了一家糖果店、把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖 小朋友来买糖的时候,他就用两种包装来组合,当然有些糖果数目是无法组合出来的,比如要买10颗糖 在这种包装情况下,最大不能买到
- ThinkPHP去除url中的index.php
- Linux | 记一次Linux服务器被入侵后的检测过程
- 阻尼牛顿法_python
- 题解 JZOJ 1353.渡河问题
- 我的世界服务器配置文件
- Linux开机自启动
- 转:细数国内市场智能语音开放平台有哪些?
- Rabbit health check failed
热门文章
- Qt 3D的未来展望
- Java一种错误的实例化方法:在默认无参构造函数中进行实例化
- STM32的ADC笔记
- linux ora 00119,ORA-00119和ORA-00132的解决方案
- python提供了_Python中 为我们提供了一些独特的解决方案的方法特性
- html 形成打印数据,用HTMLTestRunner生成报告,无法打印print的内容
- 逆向查找_CTFer成长之路--一道数独逆向题目解题过程(算法分析、查找线索)...
- 异步接口同步返回_同步|异步
- Cpp 对象模型探索 / 静态局部对象只构造一次的原因和执行析构的方法
- L、TEXT()、_TEXT()和_T()的区别