MySQL 重複挿入での自動インクリメントの防止
自動インクリメント カラムを持つテーブルに重複行を挿入すると、自動インクリメントカウンタは、挿入が無視された場合でもインクリメントを続ける場合があります。これにより、自動インクリメント値が不正確になったり、スキップされたりする可能性があります。
MySQL では、この動作は、結果に関係なく、挿入クエリの実行時に自動インクリメント カウンタがインクリメントされることが原因で発生します。この問題に対処するには、考えられる解決策がいくつかあります。
変更された挿入クエリの使用:
1 つの方法は、挿入クエリを変更して、次の場合にのみカウンタをインクリメントすることです。行はまだ存在しません。これは、INSERT IGNORE 句と LIMIT 句の組み合わせを使用して実現できます。
INSERT IGNORE INTO tablename (tag) SELECT $tag FROM tablename WHERE NOT EXISTS( SELECT tag FROM tablename WHERE tag = $tag ) LIMIT 1;
このクエリは、指定されたタグを持つ行がまだ存在しない場合にのみ挿入を実行し、自動インクリメント カウンタをインクリメントします。
トリガーの利用:
もう 1 つのオプションは、トリガーを使用して重複挿入を処理することです。トリガーは、挿入や更新などの特定のイベントがデータベース内で発生したときに自動的に実行されるデータベース コードの一部です。この場合、重複行が挿入されているかどうかを確認するトリガーを作成し、自動インクリメント カウンタの増加を防ぐことができます。
たとえば、次のトリガーは、重複挿入の自動インクリメントを防ぎます。テーブル名 table:
CREATE TRIGGER prevent_auto_increment_increment BEFORE INSERT ON tablename FOR EACH ROW BEGIN IF EXISTS ( SELECT * FROM tablename WHERE tag = NEW.tag ) THEN SET NEW.id = OLD.id; END IF; END;
結論:
これらの解決策のいずれかを実装することで、自動インクリメント カウンタが重複挿入時にインクリメントされるのを防ぎ、次のことを保証できます。自動インクリメント値は正確なままです。
以上が重複した MySQL 挿入での自動インクリメントを防ぐにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。