0

次のストアド プロシージャがあります ( 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が返されます。

何か案は?

4

1 に答える 1

0

ストアド プロシージャを書き直したところ、すべてのプラットフォームで機能するようになりました。

DELIMITER $$

DROP PROCEDURE IF EXISTS myschema.create_index_if_not_exists $$
CREATE PROCEDURE myschema.create_index_if_not_exists(in p_tableName VARCHAR(128), in p_indexName VARCHAR(128), in p_columnName VARCHAR(128) )
BEGIN

PREPARE stmt FROM 'SELECT @indexCount := COUNT(1) from information_schema.statistics WHERE `table_name` = ? AND `index_name` = ?';
SET @table_name = p_tableName;
SET @index_name = p_indexName;
EXECUTE stmt USING @table_name, @index_name;
DEALLOCATE PREPARE stmt;

-- select @indexCount;

IF( @indexCount = 0 ) THEN
  SELECT 'Creating index';
  SET @createIndexStmt = CONCAT('CREATE INDEX ', p_indexName, ' ON ', p_tableName, ' ( ', p_columnName ,')');
  PREPARE stmt FROM @createIndexStmt;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;
END IF;

END $$

DELIMITER ;

次のように使用します。

call myschema.create_index_if_not_exists('MyTable','end_time_index','end_time');

これは、MySQL 5.5.24 を使用する MAC OS X 10.8.2 および MySQL 5.5.21 を使用する Windows 7 でテストされました。

于 2012-12-13T09:11:28.237 に答える