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 -- 创建存储过程 往数据表中新增字段的更多相关文章
- Oracle中使用游标转换数据表中指定字段内容格式(拼音转数字)
应用场景:将数据表TB_USER中字段NNDP的内容中为[sannanyinv]转换为[3男1女] 主要脚本:一个游标脚本+分割字符串函数+拼音转数字脚本 操作步骤如下: 1.创建类型 create ...
- 使用python来反查数据表中的字段名
1. 链接数据库 import psycopg2 conn = psycopg2.connect(user,host,port,database,password) cur = conn.cursor ...
- MYSQL中创建存储过程实现向表中循环插入数据
首先在test数据库中先创建一个表test: CREATE TABLE test( ID INT PRIMARY KEY AUTO_INCREMENT ,test_name VARCHAR(20),t ...
- MySQL 创建和删除数据表
创建MySQL数据表需要以下信息: 表名 表字段名 定义每个表字段 语法 以下为创建MySQL数据表的SQL通用语法: CREATE TABLE table_name (column_name col ...
- MySQL 修改数据表中的字段的字符编码
1.查询 MySQL 的版本: SELECT VERSION(); 2.查询 MySQL 当前使用的字符集: SHOW VARIABLES LIKE '%character%'; 3.查询指定数据库的 ...
- MySQL 创建数据库及数据表
1.创建数据库 (1) 命令行创建 [root@host]# mysqladmin -u root -p create RUNOOB Enter password:****** (2) php创建 语 ...
- 复习MySQL①创建数据库及数据表
• 创建数据库:create database 数据库名称; – 例:创建名为test的测试数据库 create database test; • 查看创建好的数据库:show create data ...
- sql 所有数据表中 插入字段
declare @tablename varchar(200)declare @sql varchar(2000)declare cur_t cursor forselect name from sy ...
- Django 向数据表中添加字段方法
在模型order中添加字段discount字段,并给予初始值0 方法: 先在models.py中修改模型 添加 discount = models.DecimalField(max_digits=8, ...
随机推荐
- 完整的JavaScript版的信用卡校验代码
function isValidCreditCard(type, ccnum) { if (type == "Visa") { // Visa: length 16, prefix ...
- [Exception JavaWeb 1] - javax.el.PropertyNotFoundException: Property 'id' not found on ..........
好久不写Web应用了,今天碰到这个问题的时候,还一时半会没反应过来.实体类在jsp无法找对应的值. 最后发现是实体bean的属性的开头字母不能与次字母不能大写+小写或小写+大写,最后改成小写+小写就好 ...
- BOM*创建工艺路线
--工艺路线 DECLARE -- API input variables l_operation_tbl bom_rtg_pub.operation_tbl_type := bom_rtg_pub. ...
- 解决ssh登录Host key verification failed
使用SSH登录某台机器,有时因为server端的一些变动,会出现以下信息: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: R ...
- 利用Oracle 发送邮件(utl_smtp)
发送邮件的方法有很多,.NET前台也可以通过创建邮件类的形式, 通过微软提供的System.Net.Mail.dll 也可以简单的发送邮件.但是代码比较长,操作起来虽然很简单(很多细节忽略了). 这里 ...
- log4cpp基础测试
// log4cplus.cpp : 定义控制台应用程序的入口点.// #include "stdafx.h" #include <iostream>#include ...
- nginx配置文件和一些用法
fastcgi配置: location ~ \.php$ { #fastcgi_pass unix:///tmp/php-cgi.sock; fastcgi_pass unix__tmp_php5_c ...
- 使用sqlplus连接提示:ORA-28002: the password will expire within 7 days
今天在使用sqlplus时出现,或使用数据库的时候出现类似问题 =============================================== ERROR:ORA-28002: the ...
- Dev属性设置
DisplayFormat 设置显示格式如:{0:P}表示显示为百分号模式.如数据源中为0.5.表示出来为50% 2.GridContro总合计及分组合计: 常规总合计直接RunDesigner-Gr ...
- Atitit.故障排除系列---NoClassDefFoundError NoClassDefFoundError
Atitit.故障排除系列---NoClassDefFoundError NoClassDefFoundError java.lang.ClassNotFoundException找不到类异常.当应 ...