mysql实现增量语句修改表的字段
时间:2019-04-04 15:24 来源:linux.it.net.cn 作者:IT
一 前言
1、数据库增量语句:基于现有语句实现增量更新且多次执行增量语句不会影响最终结果。即满足幂等操作。
2、mysql似乎不支持不建立存储过程/函数情况,直接执行块语句。。。这点有些蛋疼
3、本文以存储过程为例。
二 实现
1、思路
查询是否满足条件
执行满足条件的操作
删除所有临时变量
2、实现前提
-- 查询当前库表信息
SELECT * FROM information_schema. COLUMNS WHERE TABLE_SCHEMA = (SELECT DATABASE())
-- 查询当前库某表信息
SELECT * FROM information_schema. COLUMNS WHERE TABLE_SCHEMA = (SELECT DATABASE())
AND TABLE_NAME = '表名'
-- 查询当前库某表某字段信息
SELECT * FROM information_schema. COLUMNS WHERE TABLE_SCHEMA = (SELECT DATABASE())
AND TABLE_NAME = '表名'
AND COLUMN_NAME = '字段名'
-- 删除某个表字段(不能有引号)
alter table 表名 drop column 字段名;
-- 添加某个表字段(不能有引号)
alter table 表名 add 字段名 varchar(128) comment '备注等';
-- 修改某个表字段(不能有引号)
alter table 表名 change 旧字段名 新字段名 varchar(128) comment '备注等';
-- 实现用户变量
SET @变量名='变量值';
SELECT @变量名;
-- 实现条件语句(必须在代码块中)
IF @变量='变量值' THEN
SELECT @变量名;
END IF;
-- 删除存储函数
DROP PROCEDURE IF EXISTS deptProc;
-- 创建存储函数
DELIMITER //
CREATE PROCEDURE deptProc()
BEGIN
SET @变量名='变量值';
SELECT @变量名;
IF @变量='变量值' THEN
SELECT @变量名;
END IF;
END//
DELIMITER ;
-- 调用存储函数
CALL deptProc();
3、增量添加某个字段
-- 删除存储过程
DROP PROCEDURE IF EXISTS testProc;
DELIMITER //
-- 创建存储过程
CREATE PROCEDURE testProc()
BEGIN
-- 查询条件
SELECT
COUNT(*) into @y
FROM
information_schema. COLUMNS
WHERE
TABLE_SCHEMA = (SELECT DATABASE())
AND TABLE_NAME = '表名'
AND COLUMN_NAME = '字段名';
-- 查询条件
-- 判断存在
IF @y=0 THEN
alter table 表名 add 字段名 varchar(32) comment '备注等';
-- ELSEIF alter table 表名 change 字段名 字段名 varchar(32) comment '备注等';
END IF;
-- 判断存在
END
//DELIMITER ;
-- 调用存储过程
CALL testProc();
-- 删除存储过程
DROP PROCEDURE IF EXISTS testProc;
4、增量修改某个字段
-- 删除存储过程
DROP PROCEDURE IF EXISTS testProc;
DELIMITER //
-- 创建存储过程
CREATE PROCEDURE testProc()
BEGIN
-- 查询条件
SELECT
COUNT(*) into @y
FROM
information_schema. COLUMNS
WHERE
TABLE_SCHEMA = (SELECT DATABASE())
AND TABLE_NAME = '表名'
AND COLUMN_NAME = '旧字段名';
-- 查询条件
-- 判断存在
IF @y=1 THEN
alter table 表名 change 旧字段名 新字段名 varchar(32) comment '备注等';
-- ELSEIF @y =0 THEN alter table 表名 add 新字段名 varchar(32) comment '备注等';
END IF;
-- 判断存在
END
//DELIMITER ;
-- 调用存储过程
CALL testProc();
-- 删除存储过程
DROP PROCEDURE IF EXISTS testProc;
4、增量删除某个字段
-- 删除存储过程
DROP PROCEDURE IF EXISTS testProc;
DELIMITER //
-- 创建存储过程
CREATE PROCEDURE testProc()
BEGIN
-- 查询条件
SELECT
COUNT(*) into @y
FROM
information_schema. COLUMNS
WHERE
TABLE_SCHEMA = (SELECT DATABASE())
AND TABLE_NAME = '表名'
AND COLUMN_NAME = '旧字段名';
-- 查询条件
-- 判断存在
IF @y=1 THEN
alter table 表名 drop 旧字段名;
END IF;
-- 判断存在
END
//DELIMITER ;
-- 调用存储过程
CALL testProc();
-- 删除存储过程
DROP PROCEDURE IF EXISTS testProc;
三、总结
1、增量语句写法类似于编写幂等接口,实现多次操作结果一致。
2、实例中多次使用存储函数创建和删除,实在是因为块语句无法脱离存储过程/函数执行
(责任编辑:IT)
一 前言 1、数据库增量语句:基于现有语句实现增量更新且多次执行增量语句不会影响最终结果。即满足幂等操作。 2、mysql似乎不支持不建立存储过程/函数情况,直接执行块语句。。。这点有些蛋疼 3、本文以存储过程为例。 二 实现 1、思路 查询是否满足条件 执行满足条件的操作 删除所有临时变量 2、实现前提 -- 查询当前库表信息 SELECT * FROM information_schema. COLUMNS WHERE TABLE_SCHEMA = (SELECT DATABASE()) -- 查询当前库某表信息 SELECT * FROM information_schema. COLUMNS WHERE TABLE_SCHEMA = (SELECT DATABASE()) AND TABLE_NAME = '表名' -- 查询当前库某表某字段信息 SELECT * FROM information_schema. COLUMNS WHERE TABLE_SCHEMA = (SELECT DATABASE()) AND TABLE_NAME = '表名' AND COLUMN_NAME = '字段名' -- 删除某个表字段(不能有引号) alter table 表名 drop column 字段名; -- 添加某个表字段(不能有引号) alter table 表名 add 字段名 varchar(128) comment '备注等'; -- 修改某个表字段(不能有引号) alter table 表名 change 旧字段名 新字段名 varchar(128) comment '备注等'; -- 实现用户变量 SET @变量名='变量值'; SELECT @变量名; -- 实现条件语句(必须在代码块中) IF @变量='变量值' THEN SELECT @变量名; END IF; -- 删除存储函数 DROP PROCEDURE IF EXISTS deptProc; -- 创建存储函数 DELIMITER // CREATE PROCEDURE deptProc() BEGIN SET @变量名='变量值'; SELECT @变量名; IF @变量='变量值' THEN SELECT @变量名; END IF; END// DELIMITER ; -- 调用存储函数 CALL deptProc(); 3、增量添加某个字段 -- 删除存储过程 DROP PROCEDURE IF EXISTS testProc; DELIMITER // -- 创建存储过程 CREATE PROCEDURE testProc() BEGIN -- 查询条件 SELECT COUNT(*) into @y FROM information_schema. COLUMNS WHERE TABLE_SCHEMA = (SELECT DATABASE()) AND TABLE_NAME = '表名' AND COLUMN_NAME = '字段名'; -- 查询条件 -- 判断存在 IF @y=0 THEN alter table 表名 add 字段名 varchar(32) comment '备注等'; -- ELSEIF alter table 表名 change 字段名 字段名 varchar(32) comment '备注等'; END IF; -- 判断存在 END //DELIMITER ; -- 调用存储过程 CALL testProc(); -- 删除存储过程 DROP PROCEDURE IF EXISTS testProc; 4、增量修改某个字段 -- 删除存储过程 DROP PROCEDURE IF EXISTS testProc; DELIMITER // -- 创建存储过程 CREATE PROCEDURE testProc() BEGIN -- 查询条件 SELECT COUNT(*) into @y FROM information_schema. COLUMNS WHERE TABLE_SCHEMA = (SELECT DATABASE()) AND TABLE_NAME = '表名' AND COLUMN_NAME = '旧字段名'; -- 查询条件 -- 判断存在 IF @y=1 THEN alter table 表名 change 旧字段名 新字段名 varchar(32) comment '备注等'; -- ELSEIF @y =0 THEN alter table 表名 add 新字段名 varchar(32) comment '备注等'; END IF; -- 判断存在 END //DELIMITER ; -- 调用存储过程 CALL testProc(); -- 删除存储过程 DROP PROCEDURE IF EXISTS testProc; 4、增量删除某个字段 -- 删除存储过程 DROP PROCEDURE IF EXISTS testProc; DELIMITER // -- 创建存储过程 CREATE PROCEDURE testProc() BEGIN -- 查询条件 SELECT COUNT(*) into @y FROM information_schema. COLUMNS WHERE TABLE_SCHEMA = (SELECT DATABASE()) AND TABLE_NAME = '表名' AND COLUMN_NAME = '旧字段名'; -- 查询条件 -- 判断存在 IF @y=1 THEN alter table 表名 drop 旧字段名; END IF; -- 判断存在 END //DELIMITER ; -- 调用存储过程 CALL testProc(); -- 删除存储过程 DROP PROCEDURE IF EXISTS testProc; 三、总结 1、增量语句写法类似于编写幂等接口,实现多次操作结果一致。 2、实例中多次使用存储函数创建和删除,实在是因为块语句无法脱离存储过程/函数执行 (责任编辑:IT) |