次のストアド プロシージャがあります ( http://dev.mysql.com/doc/refman/5.0/en/create-index.htmlのコメントから取得、テーブルにインデックスが存在するかどうかを確認するために使用):
DELIMITER $$
DROP PROCEDURE IF EXISTS `create_index_if_not_exists`$$
CREATE DEFINER=`user`@`%` PROCEDURE `create_index_if_not_exists`(table_name_vc varchar(50), index_name_vc varchar(50), field_list_vc varchar(200))
SQL SECURITY INVOKER
BEGIN
set @Index_cnt = (
select count(1) cnt
FROM INFORMATION_SCHEMA.STATISTICS
WHERE table_name = table_name_vc
and index_name = index_name_vc
);
IF ifnull(@Index_cnt,0) = 0 THEN set @index_sql = concat('Alter table ',table_name_vc,' ADD INDEX ',index_name_vc,'(',field_list_vc,');');
PREPARE stmt FROM @index_sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
END$$
DELIMITER ;
奇妙なことに、MySQL 5.5.25 を使用する CentOS 5.4 では完全に動作しますが、MySQL 5.5.24 を使用する Mac OS X 10.8.1 では動作しません。Mac では、追加すると @Index_cnt は常に 0 になります。
select @Index_cnt
ストアド プロシージャで。ステートメントを単独で実行するSELECT COUNT(1) cnt ...
と、1または0が返されます。
何か案は?