mysql创建存储过程实现往数据表中新增字段的方法分析

本文实例讲述了mysql创建存储过程实现往数据表中新增字段的方法。分享给大家供大家参考,具体如下:

需求:

往某数据库的某个表中新增一个字段(若该字段已存在,则不做操作;若该字段不存在,则新增)

百度了n久,没有符合要求的例子,只有参考加自己琢磨,最终终于给弄出来了,以下是几个版本的更迭

第一版:

DELIMITER $$
CREATE PROCEDURE insert_column()
BEGIN
IF NOT EXISTS(SELECT 1 FROM information_schema.columns
WHERE table_schema='ltivalley' AND table_name='t_luck'
AND column_name='sss' ) THEN
alter table ltivalley.t_luck add sss varchar(255) not Null;
end if;
END
$$
DELIMITER ;

此存储过程可以做到往ltivalley数据库的t_luck表中新增一个sss的字段,但写死了,毫无灵活性,故没用!

第二版:

DELIMITER $$
CREATE PROCEDURE insert_column(in dbname varchar(255),in tbname varchar(255),in colname varchar(255))
set @sql_1= concat("IF NOT EXISTS(SELECT 1 FROM
information_schema.columns WHERE table_schema=",dbname,"
AND table_name=",tbname," AND column_name=",colname,")
THEN
alter table ",dbname,".",tbname," add ",colname,"
varchar(255) not null;
end if;");
PREPARE stmt FROM @sql_1;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END
$$
DELIMITER ;

创建存储过程没有问题,但当调用的时候就会出错,报 "IF"左右出错,原因是在mysql中IF只能存在于存储过程中,此处用EXECUTE stmt来执行,等于是不在存储过程里面执行if语句,所以报错,执行不了!故没用!

第三版

DELIMITER $$
CREATE PROCEDURE insert_column(in dbname varchar(255),in tbname varchar(255),in colname varchar(255))
BEGIN
SET @selec=CONCAT('SELECT 1 FROM information_schema.columns WHERE table_schema="',dbname,'" AND table_name="',tbname,'" AND column_name="',colname,'"');
PREPARE selec FROM @selec;
SET @addcol=CONCAT('ALTER TABLE ',dbname,'.',tbname,' ADD ',colname,' VARCHAR(255)');
PREPARE addcol FROM @addcol;
IF NOT EXISTS(EXECUTE selec;)THEN
EXECUTE addcol;
END IF;
END
$$
DELIMITER ;

无法创建存储过程,原因是在IF NOT EXISTS()中,不能执行EXECUTE selec语句,原因未知。故没用!

终极版

DROP PROCEDURE IF EXISTS insert_column;
DELIMITER $$
CREATE PROCEDURE insert_column(in dbname varchar(255),in tbname varchar(255),in colname varchar(255))
BEGIN
set @iscolexists = 0;
SET @selec=CONCAT('SELECT count(*) into @iscolexists FROM information_schema.columns WHERE table_schema="',dbname,'" AND table_name="',tbname,'" AND column_name="',colname,'"');
PREPARE selec FROM @selec;
EXECUTE selec;
DEALLOCATE PREPARE selec;
SET @addcol=CONCAT('ALTER TABLE ',dbname,'.',tbname,' ADD ',colname,' VARCHAR(255)');
PREPARE addcol FROM @addcol;
IF(@iscolexists=0)THEN
EXECUTE addcol;
END IF;
END
$$
DELIMITER ;

最终的结果,先执行EXECUTE selec,将结果存放到一个变量@iscolexists中,然后再在IF()中判断@iscolexists的值,做相应操作。可用!

更多关于MySQL相关内容感兴趣的读者可查看本站专题:《MySQL存储过程技巧大全》、《MySQL常用函数大汇总》、《MySQL日志操作技巧大全》、《MySQL事务操作技巧汇总》及《MySQL数据库锁相关技巧汇总》

希望本文所述对大家MySQL数据库计有所帮助。

(0)

相关推荐

  • 细谈Mysql的存储过程和存储函数

    1 存储过程 1.1 什么是存储过程 存储过程是一组为了完成某项特定功能的sql语句集,其实质上就是一段存储在数据库中的代码,他可以由声明式的sql语句(如CREATE,UPDATE,SELECT等语句)和过程式sql语句(如IF...THEN...ELSE控制结构语句)组成.存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用. 1.2 存储过程的优缺点 优点: 1.可增强sql语言的功能和灵活性 存储过程可以用流程控制语言编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算.

  • MYSQL的存储过程和函数简单写法

    什么是存储过程 简单的说,就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能,类似于JAVA语言中的方法: ps:存储过程跟触发器有点类似,都是一组SQL集,但是存储过程是主动调用的,且功能比触发器更加强大,触发器是某件事触发后自动调用: 有哪些特性 有输入输出参数,可以声明变量,有if/else, case,while等控制语句,通过编写存储过程,可以实现复杂的逻辑功能: 函数的普遍特性:模块化,封装,代码复用: 速度快,只有首次执行需经过编译和优化步骤,后续被调用可以直接执行,省

  • 详解MySql存储过程参数的入门使用

    存储过程 in参数 的使用 IN参数只用来向过程传递信息,为默认值. -- 存储过程中 in 参数的 使用 DELIMITER ;; CREATE PROCEDURE name_in(IN `time` VARCHAR(50)) BEGIN SELECT NOW() ,`time`; END ;; CALL name_in('现在时间'); -- in 是一个形参 你可以 定义 数据类型 调用存储过程的时候 可以给 实参 DELIMITER ;; CREATE PROCEDURE name_in

  • MySQL自定义函数和存储过程示例详解

    前言 本文主要给大家介绍的是关于MySQL自定义函数和存储过程的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 1.前置条件 MySQL数据库中存在表user_info,其结构和数据如下: mysql> desc user_info; +-----------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+--

  • mysql创建存储过程实现往数据表中新增字段的方法分析

    本文实例讲述了mysql创建存储过程实现往数据表中新增字段的方法.分享给大家供大家参考,具体如下: 需求: 往某数据库的某个表中新增一个字段(若该字段已存在,则不做操作:若该字段不存在,则新增) 百度了n久,没有符合要求的例子,只有参考加自己琢磨,最终终于给弄出来了,以下是几个版本的更迭 第一版: DELIMITER $$ CREATE PROCEDURE insert_column() BEGIN IF NOT EXISTS(SELECT 1 FROM information_schema.c

  • c++获取sqlite3数据库表中所有字段的方法小结

    常用方法: 1.使用sqlite3_get_table函数 2.获取sqlite创建表的sql语句字符串,然后进行解析获取到相应的字段 3.采用配置文件的方式,将所有字段名写入配置文件 下面针对这三个方法给大家逐一详细介绍. 方法1:使用sqlite3_get_table函数 代码: char *dbname = "test.db"; int rc = sqlite3_open(dbname, &db); if (rc == SQLITE_OK) { char sql[256]

  • MySQL使用select语句查询指定表中指定列(字段)的数据

    本文介绍MySQL数据库中执行select查询语句,查询指定列的数据,即指定字段的数据. 再来回顾一下SQL语句中的select语句的语法: Select 语句的基本语法: Select <列的集合> from <表名> where <条件> order by <排序字段和方式> 如果要查询某个表中的指定列的所有数据,则查询语句可以写作: select 列名1,列名2,列名3... from <表名> 要说明一个,这个语句后面仍然可以使用wher

  • Mysql数据表中的蠕虫复制使用方法

    mysql蠕虫复制,简单来说就是将查询出来的数据不断的新增插入到指定的数据表中.通常情况,mysql蠕虫复制时用来测试表压力. 下面我们就结合简单的实例给大家介绍mysql数据表中蠕虫复制的使用. 首先我们可以先查询下已有的money表中的信息字段,表信息如下图. 蠕虫复制的基本语法: insert into + 数据表名 +字段列表/* + from 数据表名; 使用示例语句: insert into money select null,name,money from money; 然后我们使

  • java使用JDBC动态创建数据表及SQL预处理的方法

    本文实例讲述了java使用JDBC动态创建数据表及SQL预处理的方法.分享给大家供大家参考,具体如下: 这两天由于公司的需求,客户需要自定义数据表的字段,导致每张表的字段都不是固定的而且很难有一个通用的模板去维护,所以就使用JDBC动态去创建数据表,然后通过表的字段动态添加数据,数据的来源主要是用户提供的Excel直接导入到数据库中. 如果考虑到字段的类型,可以通过反射的机制去获取,现在主要用户需求就是将数据导入到数据库提供查询功能,不能修改,所以就直接都使用String类型来处理数据更加便捷.

  • mysql 导入导出数据库、数据表的方法

    Linux下均在控制台下操作.导入数据库:前提:数据库和数据表要存在(已经被创建) (1)将数据表 test_user.sql 导入到test 数据库的test_user 表中[root@test ~]# mysql -uroot -p test < /www/web/test/test_user.sql (2) 将数据库 test.sql 导入到 test 数据库test 中[root@test ~]# mysql -uroot -p test < /www/web/test/test.sq

  • Sql Server中清空所有数据表中的记录

    Sql Server中清空所有数据表中的记录 清空所有数据表中的记录: 复制代码 代码如下: exec sp_msforeachtable  @Command1 ='truncate table ?' 删除所有数据表: 复制代码 代码如下: exec sp_msforeachtable 'delete   N''?''' 清空SQL Server数据库中所有表数据的方法(有约束的情况) 其实删除数据库中数据的方法并不复杂,为什么我还要多此一举呢,一是我这里介绍的是删除数据库的所有数据,因为数据之

  • Django使用Mysql数据库已经存在的数据表方法

    使用scrapy爬取了网上的一些数据,存储在了mysql数据库中,想使用Django将数据展示出来,在网上看到都是使用Django的models和makemigration,migrate命令来创建新表,并使用. 可是我的数据已经存在了已经创建好,并且已经存储有数据了,不能再重新创建新表了. 了解Django的表明和models名称的映射关系就可以让Django使用已经存在的表. 假如在Django存在models如下: from django.db import models # Create

  • mysql创建存储过程及函数详解

    目录 1. 存储过程 1.1. 基本语法 1.2 创建一个指定执行权限的存储过程 1.3 DELIMITER 的使用 2. 创建函数  1. 存储过程 1.1. 基本语法 create procedure name ([params]) UNSIGNED [characteristics] routine_body  params : in|out|inout 指定参数列表 代表输入与输出 routine_body: SQL代码内容,以begin ........   end character

  • MySQL 数据库的约束及数据表的设计原理

    目录 1. 数据库的约束 1.1 介绍 1.2 约束类型 1.3 not null 1.4 unique 1.5 default 1.6 primary key 1.7 foreign key 1.8 check 2. 数据库表的设计 2.1 一对一关系 2.2 一对多关系 2.3 多对多关系 1. 数据库的约束 1.1 介绍 数据库中的约束 ,顾名思义即是对插入数据库中的数据进行限定,这么做的目的是为了保证数据的有效性和完整性. 这样就大幅度地提高了数据库中数据的质量,节省了数据库的空间和调用

随机推荐