3
我想要做的是一樣的東西如下:如何有條件地使用MySQL創建索引?
CREATE INDEX i_table_column
ON table(column)
IF NOT EXISTS INDEX ON table(column)
是否有可能寫在MySQL上面的說法?
我想要做的是一樣的東西如下:如何有條件地使用MySQL創建索引?
CREATE INDEX i_table_column
ON table(column)
IF NOT EXISTS INDEX ON table(column)
是否有可能寫在MySQL上面的說法?
你可以改變由米奇小麥給出的例子,以便它檢查是否存在索引對於給定的列名,但不檢查索引名稱本身:
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;
非常有幫助,謝謝 – 2012-05-21 20:21:30
查看David O'Brien的評論和示例[here](http://dev.mysql.com/doc/refman/5.0/en/create-index.html)。 – 2010-07-05 06:45:09