mysql在增加列前进行判断该列是否存在

693 阅读2分钟

通过存储过程判断字段是否存在,不存在则增加:

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');