如何防止SQL被重复执行,一个很简单的办法就是在执行之前加上判断,如果满足给定条件,则执行,否则不执行。可以通过存储过程来实现。
首先,给出修改表的一般操作,操作列表如下:
操作
SQL语句
修改表名
alter table t_book rename to bbb;
添加列
alter table 表名 add column 列名 varchar(30);
删除列
alter table 表名 drop column 列名;
修改列名
alter table bbb change nnnnn hh int;
修改列属性
alter table t_book modify name varchar(22); 然后,以添加列为例,在添加之前如果列不存在则添加,如果列存在则不执行,这里面就需要获取到表结构,判断列是否存在。这里涉及到一个系统表,如下:
INFORMATION_SCHEMA COLUMNS表
COLUMNS表给出了表中的列信息。
标准名称
SHOW名称
注释
TABLE_CATALOG
NULL
TABLE_SCHEMA
TABLE_NAME
COLUMN_NAME
Field
ORDINAL_POSITION
参见注释
COLUMN_DEFAULT
Default
IS_NULLABLE
Null
DATA_TYPE
Type
CHARACTER_MAXIMUM_LENGTH
Type
CHARACTER_OCTET_LENGTH
NUMERIC_PRECISION
Type
NUMERIC_SCALE
Type
CHARACTER_SET_NAME
COLLATION_NAME
Collation
COLUMN_TYPE
Type
MySQL扩展
COLUMN_KEY
Key
MySQL扩展
EXTRA
Extra
MySQL扩展
COLUMN_COMMENT
Comment
MySQL扩展
该表给出了表结构中列的相关信息,包括:列名,列类型,列注释等等。
最后,写存储过程来实现功能。
--删除列
drop PROCEDURE if EXISTS add_col_homework;
create procedure add_col_homework() BEGIN
IF EXISTS (SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='mydatabase' AND table_name='mytable' AND COLUMN_NAME='mycolumn')
THEN
ALTER TABLE `mytable` DROP COLUMN `mycolumn`;
END IF;
END;
call add_col_homework();
drop PROCEDURE if EXISTS add_col_homework;
---修改列名
drop PROCEDURE if EXISTS add_col_homework;
create procedure add_col_homework() BEGIN
IF EXISTS (SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='mydatabase' AND table_name='mytable' AND COLUMN_NAME='mycolumn')
THEN
ALTER TABLE `mytable` change column mycolumn mycolumnOther varchar(30) not null comment '修改注释';
END IF;
END;
call add_col_homework();
drop PROCEDURE if EXISTS add_col_homework;
-----修改列属性--
drop PROCEDURE if EXISTS add_col_homework;
create procedure add_col_homework() BEGIN
IF EXISTS (SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='mydatabase' AND table_name='mytable' AND COLUMN_NAME='mycolumn' and COLUMN_COMMENT='原有注释' )
THEN
ALTER TABLE `mytable` MODIFY `mycolumn` int not null comment '修改注释';
END IF;
END;
call add_col_homework();
drop PROCEDURE if EXISTS add_col_homework;
drop PROCEDURE if EXISTS add_col_homework;
create procedure add_col_homework() BEGIN
IF not EXISTS (SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='mydatabase' AND table_name='mytable' AND COLUMN_NAME='mycolumn' AND COLUMN_TYPE='varchar(20)' and COLUMN_COMMENT='原有注释')
THEN
ALTER TABLE `mytable` MODIFY `mycolumn` varchar(20) not null comment '修改注释';
END IF;
END;
call add_col_homework();
drop PROCEDURE if EXISTS add_col_homework;
--添加列
drop PROCEDURE if EXISTS add_col_homework;
create procedure add_col_homework() BEGIN
IF not EXISTS (SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='mydatabase' AND table_name='mytable' AND COLUMN_NAME='mycolumn')
THEN
ALTER TABLE `mytable` add COLUMN `mycolumn` varchar(20) not null comment '注释';
END IF;
END;
call add_col_homework();
drop PROCEDURE if EXISTS add_col_homework;
最后,给出MySQL系统表连接:
http://dev.mysql.com/doc/refman/5.1/zh/information-schema.html