テーブルにインデックスを追加しようとしていますが、インデックスが存在しない場合のみです。インデックス名がわかりません。 mysql manual でalter ignore
コマンドを見つけました:
ALTER [IGNORE] TABLE tbl_name
[alter_specification [, alter_specification] ...]
[partition_options]
alter_specification:
table_options
...
| ADD {INDEX|KEY} [index_name]
[index_type] (index_col_name,...) [index_option] ...
そこで、私は次のことを試みました:
ALTER IGNORE TABLE payments ADD INDEX (id_project);
ただし、これは失敗し、次のエラーが表示されます。
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IGNORE TABLE payments ADD INDEX (id_project)'
結局のところ、これはmysql 5.7.4以降では削除されています。
新しいバージョンのmysqlでこれを行うための良い方法は何ですか?
ご参考までに...
変更ログ2014-03-27 5.6.17-追加または変更された機能-
ALTER TABLEのIGNORE句( http://dev.mysql.com/doc/refman/5.6/en/alter-table.html )は廃止され、将来のバージョンでは削除される予定です。 MySQL。 ALTER IGNORE TABLEは、レプリケーションの問題を引き起こし、一意のインデックス作成のためのオンラインALTER TABLEを妨げ、外部キー(親テーブルで削除された行)の問題を引き起こします。
これは役立つかもしれません:
インデックスを作成し、名前ですでに存在するかどうかを確認するストアドプロシージャを作成しました。
そのコードは MySQLへの私の回答にあります:MySQL:インデックスを作成する存在しない場合 私はSep 19, 2012
と書きました
私はその古い記事でそのコードをテストしました。できます。
ストアドプロシージャは、列名の組み合わせではなく、インデックス名のみをチェックします(このようなシナリオがある場合の対処方法については、この投稿の下部を参照してください)。
これがその投稿のコードです
use mydb
DELIMITER $$
DROP PROCEDURE IF EXISTS `CreateIndex` $$
CREATE PROCEDURE `CreateIndex`
(
given_database VARCHAR(64),
given_table VARCHAR(64),
given_index VARCHAR(64),
given_columns VARCHAR(64)
)
BEGIN
DECLARE IndexIsThere INTEGER;
SELECT COUNT(1) INTO IndexIsThere
FROM INFORMATION_SCHEMA.STATISTICS
WHERE table_schema = given_database
AND table_name = given_table
AND index_name = given_index;
IF IndexIsThere = 0 THEN
SET @sqlstmt = CONCAT('CREATE INDEX ',given_index,' ON ',
given_database,'.',given_table,' (',given_columns,')');
PREPARE st FROM @sqlstmt;
EXECUTE st;
DEALLOCATE PREPARE st;
ELSE
SELECT CONCAT('Index ',given_index,' already exists on Table ',
given_database,'.',given_table) CreateindexErrorMessage;
END IF;
END $$
DELIMITER ;
今、あなたが使用したコマンドで
ALTER IGNORE TABLE payments ADD INDEX (id_project);
あなたはそれを
ALTER TABLE payments ADD INDEX id_project_ndx (id_project);
もちろん、インデックス名id_project_ndx
がすでに存在する場合はエラーになります。
次を実行すると
ALTER TABLE payments ADD INDEX (id_project);
存在しない場合は、id_project
というインデックスが作成されます。 id_project
と呼ばれるインデックスがすでに存在する場合、mysqldは別のインデックス(おそらくid_project_2またはそれに似たもの)を作成しますが、私は としてCreate the Index Anyway
、それは重複インデックスを生成します(このコンテキストでは、重複インデックスは名前が異なりますが、同じテーブルの別のインデックスからの列の同じリストを持つインデックスです)。これが発生した場合、または重複するインデックスが存在するかどうかわからない場合は、 pt-duplicate-key-checker をダウンロードして実行し、どのインデックスが推奨されるかを確認できます。削除しても、同じ検索性を維持できます。
ストアドプロシージャを使用すると、次のようにインデックスと列に名前を付ける必要があります。
use mydb
call CreateIndex(DATABASE(),'payments','id_project_ndx','id_project');