文档章节

mysql 新增字段时判断字段是否存在

learn_more
 learn_more
发布于 2016/04/01 17:42
字数 475
阅读 1722
收藏 4

1、问题引出

为了保证数据的正确性,代码的健壮性,我们必须对一些边界条件做一个判断,所以才会把修改表结构搞得如此复杂。

mysql 新增字段时判断字段是否存在,本来是一个很小的问题,因为以前都是使用 postgreSql、sqlserver ,上来就 if not exist ,结果mysql并不吃这一套,看看这段代码:

 IF NOT EXISTS (
 SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS 
 WHERE TABLE_NAME = 't_subject' 
 AND COLUMN_NAME = 'subject_status'
 )THEN 
 ALTER TABLE t_subject ADD COLUMN `subject_status` int(1) DEFAULT '0' COMMENT '0:未被引用;1:已被用';
 END IF;

在 navicat执行时总出现错误,纳闷啊............................


2、问题分析

网上查了很多,发现不能这样直接执行脚本,那就没办法了,变态的写法就是直接定义存储过程,然后执行存储过程,最后删除存储过程,看到这你是不是想呵呵了,无论怎样,这最终是一种解决方法


3、问题解决

// 创建存储过程 名称定义 以temp开头意为临时的,Alter_Table_T_Subject 意为修改T_Subject,20160411 意为存储过程创建的日期

CREATE PROCEDURE Temp_Alter_Table_T_Subject_20160411()
    BEGIN
        IF NOT EXISTS (SELECT 1 
                FROM INFORMATION_SCHEMA.COLUMNS 
                WHERE TABLE_NAME = 't_subject' 
                AND COLUMN_NAME = 'subject_status')
         THEN 
 ALTER TABLE t_subject ADD COLUMN `subject_status` int(1) DEFAULT '0' COMMENT '0:未引用;1:已被用';
         END IF;
    END

// 调用存储过程

CALL Temp_Alter_Table_T_Subject_20160411()

// 删除存储过程

DROP PROCEDURE Temp_Alter_Table_T_Subject_20160411;


4、真诚希望

希望有更好的方式,否则这个太变态了,我是不是还要写一个函数,来判断这个存储过程是否已经存在了,我去太复杂了,真诚希望有更好的方式,可以留言!



© 著作权归作者所有

learn_more
粉丝 93
博文 240
码字总数 210196
作品 0
深圳
程序员
私信 提问
基于FMDB数据库操作类--PYFMDB

前言 之前是一直做web开发,对于做web开发的人而言一定熟悉各种ORM,各种语言针对mysql的ORM有很多,比如PHP的各类框架yii,thinkphp,laravel,ruby语言的rails, GO语言的beego等,IOS开发则...

terryPeng
2016/03/17
566
0
yii2使用Migrations为整个数据库表创建迁移

本教程为整个数据库表进行创建迁移,弥补以前未做的工作,且仅适合于Migrations(2.0.8)版本用户及以上。 大家都知道Migrations是一个在开发和维护数据库驱动的应用过程中,数据库的结构与源...

botkenni
2018/05/03
584
0
asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案

之前碰到asp.net core异步进行新增操作并且需要判断某些字段是否重复的问题,进行插入操作的话会导致数据库中插入重复的字段!下面把我的解决方法记录一下,如果对您有所帮助,欢迎拍砖! 场...

依乐祝
2018/05/29
0
0
THINKPHP_动态验证validate()

$data=I('post.','','trim'); $rules = array( array('name','','数据名称已存在',0,'unique',1), //array(验证字段1,验证规则,错误提示,[验证条件,附加规则,验证时间]), array('verify','r......

喵王不瞌睡
2014/08/16
8.3K
0
MySQL insert or update SQL 示例

建表 创建一个合适的表,表中必须有唯一索引,因为更新的时候就依据唯一索引更新的 编写sql测试 结合两个sql可以得出结论:ON DUPLICATE KEY UPDATE之后的字段少了UNIQUE INDEX中涉及的两个字...

Listen_ing
2016/05/25
159
0

没有更多内容

加载失败,请刷新页面

加载更多

当阿里云工程师回到了家乡......

根据真实故事改编 略有浮夸 但重要的是 9月25日13:30-16:30 云栖大会「5G边缘计算专场」 一定要来哦 !!! 本文作者:樰篱 原文链接 本文为云栖社区原创内容,未经允许不得转载。...

Mr_zebra
13分钟前
2
0
文件操作工具类 FileUtils常用方法

文件操作工具类(FileUtils) 使用该工具类的前提是项目里导入commons-io 包 import org.apache.commons.io.FileUtils; List<String> lines=new ArrayList<String>(); lines.add("欢迎访问:......

AndLong
19分钟前
3
0
maven-shade-plugin

最近,用规则引擎(drools)的封装了一个jar包,给别人使用。用的是maven-assembly-plugin打的包,可以把多个jar包里的class 给打成一个jar,感觉还是满好用的,但是打包成功后,发现报空指针错...

internetafei
24分钟前
2
0
Cassandra repair 工具使用

前言 Cassandra是一款去中心化的分布式数据库。一份数据会分布在多个对等的节点上,即有多个副本。我们需要定期的对多个副本检查,看是否有不一致的情况。比如因为磁盘损坏,可能会导致副本丢...

阿里云官方博客
27分钟前
1
0
element-vue使用富文本编辑器【前端】

一、前言 1.富文本编辑器选择的为vue-quill-editor 官方地址:https://quilljs.com/docs/quickstart/ 2.安装 cnpm install vue-quill-editor cnpm install quill 3.在对应的页面引入,在com...

一代码农码一代
33分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部