簡體   English   中英

如何從存儲過程創建索引或在MySQL中的每個表上創建索引?

[英]How do I create an index from a stored procedure or create index on every table in 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行的錯誤1064(42000):您的SQL語法有錯誤; 檢查與您的MySQL服務器版本相對應的手冊,以在'makeIndexSql附近使用正確的語法; 執行stmt; 萬一; 在第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行的錯誤1064(42000):您的SQL語法有錯誤; 檢查與您的MySQL服務器版本相對應的手冊以在'if @i> 0附近使用正確的語法,然后在第1行開始在ACHD上創建索引'idx_ACHDebitFrequencies_modified_on'

版本mysql-5.1.62-r1

過程的核心問題是PREPARE語句僅適用於用戶變量或字符串文字。 它無法從過程變量准備語句。

准備語法
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 ;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM