通过存储过程判断字段是否存在,不存在则增加:
DROP PROCEDURE IF EXISTS pro_AddColumn //
CREATE PROCEDURE pro_AddColumn()
BEGIN
IF NOT EXISTS(SELECT 1 FROM information_schema.columns WHERE table_name='component' AND COLUMN_NAME='PRINT_CHECK_STATUS') THEN
ALTER TABLE component ADD PRINT_CHECK_STATUS int(10) default 0;
END IF;
IF NOT EXISTS(SELECT 1 FROM information_schema.columns WHERE table_name='component' AND COLUMN_NAME='PRINT_CHECK_BACK_REASON') THEN
ALTER TABLE component ADD PRINT_CHECK_BACK_REASON varchar(500) default null;
END IF;
END //
CALL pro_AddColumn //
DROP PROCEDURE pro_AddColumn //
DELIMITER ;
在MySQL中,//
用作自定义的结束符号,以代替默认的分号(;
)。当创建存储过程时,存储过程的主体部分可能包含多个SQL语句,而每个语句都以分号(;
)结束。然而,分号(;
)也用作SQL语句本身的结束符,这可能导致与存储过程中的分号冲突。
为了避免这种冲突,我们使用DELIMITER
语句来指定自定义的结束符号。在DELIMITER
语句之后,所有的SQL语句都会使用新的结束符号。在这里,我们使用//
作为结束符号。
因此,在使用DELIMITER
语句之后,我们可以在存储过程的定义中使用分号(;
),而不会被解释为存储过程的结束。当定义完存储过程后,我们使用默认的结束符号(;
)来恢复。
注意://
只是一个示例,你可以使用任何你喜欢的字符作为结束符号,只要它不与存储过程中的语句冲突即可。
通过存储过程判断索引是否存在,不存在则增加:
DROP PROCEDURE IF EXISTS pro_AddIndex;
DELIMITER;
CREATE PROCEDURE pro_AddIndex() BEGIN IF NOT EXISTS (SELECT * FROM information_schema.statistics WHERE table_schema=CurrentDatabase AND table_name = 'rtc_phototype' AND index_name = 'index_name') THEN
ALTER TABLE `rtc_Phototype` ADD INDEX index_name ( `imgtype` );
END IF;
END; DELIMITER; CALL pro_AddIndex(); Drop procedure pro_AddIndex;
插入语句判断是否存在,不存在则插入:
insert into permission(id,name,navigation_id,parentid) select '130','印前审查',null,'1' from DUAL WHERE NOT EXISTS(SELECT * FROM permission WHERE id='130');
insert into navigation(id,name,parent,path,seq_num,sub_sys,url) select '39','参数配置',11,'/3/11',1,3,null from DUAL WHERE NOT EXISTS(SELECT * FROM navigation WHERE id='39');