web-dev-qa-db-ja.com

MySQL:ALTER IGNORE TABLE ADD UNIQUE、何が切り捨てられますか?

ID、タイプ、所有者、説明の4つの列を持つテーブルがあります。 IDはAUTO_INCREMENT PRIMARY KEYであり、次の操作を行います。

ALTER IGNORE TABLE `my_table`
    ADD UNIQUE (`type`, `owner`);

もちろん、type = 'Apple'およびowner = 'Apple CO'のレコードはほとんどありません。だから私の質問は、そのALTER TABLEの後に残る特別なレコード、つまり最小のIDを持つレコード、または最新の挿入として最大のレコードになるでしょうか?

30
kuba

最初のレコードは保持され、残りは削除されます §§

IGNOREは、標準SQLのMySQL拡張です。新しいテーブルの一意のキーに重複がある場合、または厳密モードが有効になっているときに警告が発生した場合、ALTER TABLEの動作を制御します。 IGNOREが指定されていない場合、重複キーエラーが発生するとコピーが中止され、ロールバックされます。 IGNOREが指定されている場合、一意のキーに重複がある行のfirst行のみが使用され、他の競合する行はdeleted。不正な値は、最も近い一致する許容値に切り捨てられます

ここで「最初」とは、IDが主キーであると想定して、最小のIDを持つものを意味すると思います。

また注意してください:

MySQL 5.7.4以降、ALTER TABLEIGNORE句はremovedであり、これを使用するとエラー

44
Galz

あなたの問題は、ALTER IGNOREが廃止されたまさにその理由の1つであるようです。

これは、ALTER IGNOREの非推奨に関する MySQLノート からのものです。

"この機能は正しく定義されていません(最初の行は何ですか?)。レプリケーションで問題が発生し、一意のインデックス作成のオンライン変更が無効になり、外部キーで問題が発生しました(親テーブルで行が削除されました) 。 "

0
Sally Levesque