如何防止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
本文介绍了如何防止SQL语句在MySQL中被重复执行,主要方法是在执行前添加判断条件,通过存储过程来实现。文章列举了使用INFORMATION_SCHEMA COLUMNS表来获取表列信息的示例。
743

被折叠的 条评论
为什么被折叠?



