2013-06-22 29 views
1

这些是我到目前为止已经试过,用自己的错误消息一起两件事情:如何从存储过程创建索引或在MySQL的每个表上创建索引?

DELIMITER // 

CREATE PROCEDURE createModifiedIndex(t varchar(256)) 
    BEGIN 
    declare idx varchar(256); 
    DECLARE i int; 
    declare makeIndexSql varchar(256); 
    set idx = concat('idx_', t, '_modified_on'); 
    set i = (select count(*) from INFORMATION_SCHEMA.STATISTICS where table_name = t and index_name = idx); 
    if i > 0 then 
     set makeIndexSql = concat('create index ', idx, ' on ', t, ' (modified_on);'); 
     prepare stmt from makeIndexSql; 
     execute stmt; 
    end if; 
    END // 

DELIMITER ; 

call createModifiedIndex ('ACHDebitFrequencies'); 
call createModifiedIndex ... 
第5行

ERROR 1064(42000):你在你的SQL语法错误;查看与您的MySQL服务器版本相对应的手册,以找到在'makeIndexSql; 执行stmt; end if; END'在第10行

这是另一个不同的尝试,但不起作用,因为MySQL不允许IF/THEN以外的存储过程。

set @i = (select count(*) from INFORMATION_SCHEMA.STATISTICS where table_name = 'ACHDebitFrequencies' and index_name = 'idx_ACHDebitFrequencies_modified_on'); 
if @i > 0 then begin 
     create index 'idx_ACHDebitFrequencies_modified_on' on ACHDebitFrequencies (modified_on); 
end; 
end if; 
... 
在3线

ERROR 1064(42000):你在你的SQL语法错误;检查对应于你的MySQL服务器版本使用附近的正确语法手册“如果@i> 0,则开始 创建索引‘’上ACHD” idx_ACHDebitFrequencies_modified_on在1号线

版本的MySQL-5.1.62- r1

回答

1

您的过程的核心问题是PREPARE语句只能用于用户变量或字符串文字。它不能从程序变量中准备一个语句。

PREPARE Syntax
PREPARE stmt_name FROM preparable_stmt
... preparable_stmt或者是字符串文字或可变是 包含SQL语句的文本的用户。

DELIMITER // 
CREATE PROCEDURE createModifiedIndex(t VARCHAR(256)) 
    BEGIN 
    DECLARE idx VARCHAR(256); 
    DECLARE i INT; 

    SET idx = CONCAT('idx_', t, '_modified_on'); 
    SET i = (SELECT COUNT(*) FROM INFORMATION_SCHEMA.STATISTICS WHERE table_name = t AND index_name = idx); 
    IF i = 0 THEN 
     SET @makeIndexSql = CONCAT('CREATE INDEX ', idx, ' ON ', t, ' (modified_on);'); 
     PREPARE stmt FROM @makeIndexSql; 
     EXECUTE stmt; 
     DEALLOCATE PREPARE stmt; -- Use DEALLOCATE when you're done with the statement 
    END IF; 
    END // 

DELIMITER ; 
+0

哇。奥术。我明天会尝试。 – Chloe

+0

是的,工作!谢谢!我也必须改变'如果我= 0然后'。咄。 – Chloe

+0

@Chloe你不止欢迎:) – peterm