2013-06-22 30 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