2010-07-05 79 views
3

我想要做的是一樣的東西如下:如何有條件地使用MySQL創建索引?

CREATE INDEX i_table_column 
ON table(column) 
IF NOT EXISTS INDEX ON table(column) 

是否有可能寫在MySQL上面的說法?

+0

查看David O'Brien的評論和示例[here](http://dev.mysql.com/doc/refman/5.0/en/create-index.html)。 – 2010-07-05 06:45:09

回答

4

你可以改變由米奇小麥給出的例子,以便它檢查是否存在索引對於給定的列名,但不檢查索引名稱本身:

delimiter // 
DROP PROCEDURE IF EXISTS create_index_if_not_exists// 
CREATE PROCEDURE `create_index_if_not_exists` (IN param_schema CHAR(255), IN param_table CHAR(255), IN param_column CHAR(255)) 
BEGIN 

    SELECT @indexes := COUNT(*) 
     FROM INFORMATION_SCHEMA.STATISTICS 
     WHERE table_schema = param_schema 
     AND table_name = param_table 
     AND COLUMN_NAME = param_column; 

    IF @indexes = 0 THEN 
     SET @sql_cmd := CONCAT(
      'ALTER TABLE ', 
      param_table, 
      ' ADD INDEX ', 
      '`', param_column, '` ', 
      '(', param_column, ')'); 
     SELECT @sql_cmd; 
     PREPARE stmt FROM @sql_cmd; 
     EXECUTE stmt; 
     DEALLOCATE PREPARE stmt; 
    END IF; 

END// 
delimiter ; 

例子:

DROP TABLE IF EXISTS `table1`; 

CREATE TABLE `table1` (
    `id` int(10) unsigned NOT NULL auto_increment, 
    `col1` int(10) unsigned, 
    `col2` int(10) unsigned, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB; 

CALL create_index_if_not_exists('test', 'table1', 'col2'); 

+--------------------------------------------+ 
| @sql_cmd         | 
+--------------------------------------------+ 
| ALTER TABLE table1 ADD INDEX `col1` (col1) | 
+--------------------------------------------+ 

SHOW CREATE TABLE `table1`; 

CREATE TABLE `table1` (
    `id` int(10) unsigned NOT NULL auto_increment, 
    `col1` int(10) unsigned default NULL, 
    `col2` int(10) unsigned default NULL, 
    PRIMARY KEY (`id`), 
    KEY `col1` (`col1`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 

下面的行顯示了要被執行的命令,並且可以在必要時從存儲過程除去:

SELECT @sql_cmd; 
+0

非常有幫助,謝謝 – 2012-05-21 20:21:30