web-dev-qa-db-ja.com

mysql-ALTER IGNORE ADD INDEXはmysql 5.7.4で削除されました-代わりに何を使用しますか?

テーブルにインデックスを追加しようとしていますが、インデックスが存在しない場合のみです。インデックス名がわかりません。 mysql manualalter 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でこれを行うための良い方法は何ですか?

4
maniexx

ご参考までに...

変更ログ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を妨げ、外部キー(親テーブルで削除された行)の問題を引き起こします。

1
Rick James

これは役立つかもしれません:

  1. 既存のテーブルの名前を変更して、新しいテーブルを作成します。
  2. 古いテーブルから新しいテーブルにデータをコピーするには、挿入無視を使用します。
1
Noah

インデックスを作成し、名前ですでに存在するかどうかを確認するストアドプロシージャを作成しました。

そのコードは 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'); 

試してみる !!!

0
RolandoMySQLDBA