mysql 修改表结构脚本
2015-10-15 10:41
555 查看
参考 http://stackoverflow.com/questions/972922/add-column-to-mysql-table-if-it-does-not-exist
DELIMITER $$
DROP PROCEDURE IF EXISTS addFieldIfNotExists
$$
DROP FUNCTION IF EXISTS isFieldExisting
$$
CREATE FUNCTION isFieldExisting (schema_name_IN VARCHAR(100), table_name_IN VARCHAR(100), field_name_IN VARCHAR(100))
RETURNS INT
RETURN (
SELECT COUNT(COLUMN_NAME)
FROM INFORMATION_SCHEMA.columns
WHERE TABLE_SCHEMA = schema_name_IN
AND TABLE_NAME = table_name_IN
AND COLUMN_NAME = field_name_IN
)
$$
CREATE PROCEDURE addFieldIfNotExists (
IN schema_name_IN VARCHAR(100),
IN table_name_IN VARCHAR(100),
IN field_name_IN VARCHAR(100),
IN field_definition_IN VARCHAR(100)
)
BEGIN
SET @isFieldThere = isFieldExisting(schema_name_IN, table_name_IN, field_name_IN);
IF (@isFieldThere = 0) THEN
SET @ddl = CONCAT('ALTER TABLE ', table_name_IN);
SET @ddl = CONCAT(@ddl, ' ', 'ADD COLUMN') ;
SET @ddl = CONCAT(@ddl, ' ', field_name_IN);
SET @ddl = CONCAT(@ddl, ' ', field_definition_IN);
PREPARE stmt FROM @ddl;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
END;
$$
-- 测试表
CREATE TABLE `mytbl` (
`c1` INT(11) NULL DEFAULT NULL,
`c2` INT(11) NULL DEFAULT NULL,
`c3` INT(11) NULL DEFAULT NULL
)
ENGINE=MyISAM;
CALL addFieldIfNotExists ('vnap_user', 'mytbl', 'c1_1', 'INT(11) NULL DEFAULT NULL AFTER `c1`');
CALL addFieldIfNotExists ('vnap_user', 'mytbl', 'c2_1', 'INT(11) NULL DEFAULT NULL AFTER `c2`');
CALL addFieldIfNotExists ('vnap_user', 'mytbl', 'c3_1', 'INT(11) NULL DEFAULT NULL AFTER `c3`');
DELIMITER $$
DROP PROCEDURE IF EXISTS addFieldIfNotExists
$$
DROP FUNCTION IF EXISTS isFieldExisting
$$
CREATE FUNCTION isFieldExisting (schema_name_IN VARCHAR(100), table_name_IN VARCHAR(100), field_name_IN VARCHAR(100))
RETURNS INT
RETURN (
SELECT COUNT(COLUMN_NAME)
FROM INFORMATION_SCHEMA.columns
WHERE TABLE_SCHEMA = schema_name_IN
AND TABLE_NAME = table_name_IN
AND COLUMN_NAME = field_name_IN
)
$$
CREATE PROCEDURE addFieldIfNotExists (
IN schema_name_IN VARCHAR(100),
IN table_name_IN VARCHAR(100),
IN field_name_IN VARCHAR(100),
IN field_definition_IN VARCHAR(100)
)
BEGIN
SET @isFieldThere = isFieldExisting(schema_name_IN, table_name_IN, field_name_IN);
IF (@isFieldThere = 0) THEN
SET @ddl = CONCAT('ALTER TABLE ', table_name_IN);
SET @ddl = CONCAT(@ddl, ' ', 'ADD COLUMN') ;
SET @ddl = CONCAT(@ddl, ' ', field_name_IN);
SET @ddl = CONCAT(@ddl, ' ', field_definition_IN);
PREPARE stmt FROM @ddl;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
END;
$$
-- 测试表
CREATE TABLE `mytbl` (
`c1` INT(11) NULL DEFAULT NULL,
`c2` INT(11) NULL DEFAULT NULL,
`c3` INT(11) NULL DEFAULT NULL
)
ENGINE=MyISAM;
CALL addFieldIfNotExists ('vnap_user', 'mytbl', 'c1_1', 'INT(11) NULL DEFAULT NULL AFTER `c1`');
CALL addFieldIfNotExists ('vnap_user', 'mytbl', 'c2_1', 'INT(11) NULL DEFAULT NULL AFTER `c2`');
CALL addFieldIfNotExists ('vnap_user', 'mytbl', 'c3_1', 'INT(11) NULL DEFAULT NULL AFTER `c3`');
相关文章推荐
- mysql 学习---->字符串、数值处理、日期、查询的逻辑处理、系统相关内容查询、IP地址相关、密码
- MySQL数据库
- mysql 学习---->数值计算、逻辑判断、范围选择、位运算
- mysql 学习---->字段
- MYSQL CLUSTER 7.4 + 5.6 创建磁盘表和内存表
- mysql ODBC 在64位下提示找不到odbc驱动问题
- MySQL information_schema 数据库
- mysql 学习----->查询,权限,字段控制
- Mysql_mysql force Index 强制索引
- codeigniter 操作mysql的PHP代码--更新
- MySQL 5.6内存占用过高解决方案
- PowerDesigner生成mysql字段comment注释
- MySql:备份与恢复数据库
- 多mysql环境(wamp和单独配置的环境同时存在)如何使用这个环境
- ubuntu install mysql
- win8 下免安装版mysql
- MySql调优
- 重启服务--如:MySQL
- mysql++使用
- 解决mysql忘记密码