文档章节

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

learn_more
 learn_more
发布于 2016/04/01 17:42
字数 475
阅读 4.5K
收藏 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
582
0
yii2使用Migrations为整个数据库表创建迁移

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

botkenni
2018/05/03
758
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.5K
0
MySQL insert or update SQL 示例

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

Listen_ing
2016/05/25
269
0

没有更多内容

加载失败,请刷新页面

加载更多

SQL Server中是否有一个Max函数采用两个值,如.NET中的Math.Max?

我想写这样的查询: SELECT o.OrderId, MAX(o.NegotiatedPrice, o.SuggestedPrice)FROM Order o 但这不是MAX函数的工作原理,对吗? 它是一个聚合函数,因此需要一个参数,然后返回所有行的...

技术盛宴
4分钟前
5
0
是否可以编写模板来检查函数的存在?

是否可以编写一个模板来更改行为,具体取决于是否在类上定义了某个成员函数? 这是我要写的一个简单示例: template<class T>std::string optionalToString(T* obj){ if (FUNCTION_EX...

javail
19分钟前
17
0
聊聊artemis的confirmationWindowEnabled

序 本文主要研究一下artemis的confirmationWindowEnabled confirmationWindowEnabled activemq-artemis-2.11.0/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client......

go4it
今天
78
0
单例模式(饿汉式和懒汉式)

所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。 饿汉式 public class SingletonTest1 { ...

SongAlone
今天
76
0
uni-app学习:4、数据绑定(变量、数组、显示控制)

基本等同与vue,把代码跑一下,看看就明白了。 其中, v-hidden 貌似不管是 true or false 都有显示 v-show 才切换。 和vue 一样,数组循环中要加key绑定,只不过如果不加的话会有警告。 ...

轻轻的走过
今天
69
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部