【问题标题】:MySQL stored procedure not working on Mac OS XMySQL 存储过程在 Mac OS X 上不起作用
【发布时间】:2012-12-13 17:11:28
【问题描述】:

我有以下存储过程(取自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 ;

奇怪的是,它在 CentOS 5.4 和 MySQL 5.5.25 上完美运行,但在 Mac OS X 10.8.1 和 MySQL 5.5.24 上不工作。在 Mac 上,如果我添加,@Index_cnt 始终为 0

select @Index_cnt

在存储过程中。如果我自己执行SELECT COUNT(1) cnt ... 语句,则返回应为的 1 或 0。

有什么想法吗?

【问题讨论】:

  • 你确定CentOS和OSX下底层数据是一样的吗?
  • 这可能与 CentOS 中的文件系统区分大小写有关,而 OSX 则不是(秘密)?
  • @trojanfoe 是的,我确定
  • @wkoot 我刚刚测试过,它在 Windows 中也不起作用。不知道这有助于诊断问题吗?
  • Windows 也是不敏感的。你能检查另一个 unix 发行版吗?也许是一个 ubuntu 虚拟机

标签: mysql macos centos


【解决方案1】:

我已经重写了存储过程,现在可以在所有平台上使用:

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 上测试的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 2012-04-07
    • 2016-04-06
    • 2014-10-19
    相关资源
    最近更新 更多