如何防止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