を使用しINSERT IGNORE INTO table
ます。
構文もありINSERT … ON DUPLICATE KEY UPDATE
ます。説明は13.2.6.2 INSERT ... ON DUPLICATE KEY UPDATE ステートメントにあります。
Google の webcacheによると、 bogdan.org.uaからの投稿:
2007 年 10 月 18 日
はじめに: 最新の MySQL では、タイトルに示されている構文は使用できません。しかし、既存の機能を使用して期待されることを達成するための非常に簡単な方法がいくつかあります。
INSERT IGNORE、REPLACE、または INSERT … ON DUPLICATE KEY UPDATE の 3 つの解決策が考えられます。
テーブルがあると想像してください:
CREATE TABLE `transcripts` (
`ensembl_transcript_id` varchar(20) NOT NULL,
`transcript_chrom_start` int(10) unsigned NOT NULL,
`transcript_chrom_end` int(10) unsigned NOT NULL,
PRIMARY KEY (`ensembl_transcript_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
ここで、Ensembl からトランスクリプトのメタデータをインポートする自動パイプラインがあり、さまざまな理由により、実行の任意のステップでパイプラインが壊れる可能性があるとします。したがって、次の 2 つのことを確認する必要があります。
- パイプラインを繰り返し実行しても、 > データベースは破壊されません
- 'duplicate > primary key' エラーが原因で繰り返し実行が終了することはありません。
方法 1: REPLACE を使用する
とても簡単です:
REPLACE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;
レコードが存在する場合は上書きされます。まだ存在しない場合は、作成されます。ただし、この方法を使用することは、このケースでは効率的ではありません。既存のレコードを上書きする必要はありません。スキップするだけで十分です。
方法 2: INSERT IGNORE を使用する また、非常に簡単です。
INSERT IGNORE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;
ここで、'ensembl_transcript_id' がデータベースに既に存在する場合は、黙ってスキップされます (無視されます)。(より正確には、MySQL リファレンス マニュアルからの引用です。または、テーブル内の PRIMARY KEY 値により、重複キー エラーが発生し、ステートメントが中止されます。) レコードがまだ存在しない場合は、作成されます。
この 2 番目の方法には、他の問題が発生した場合にクエリが中止されないなど、いくつかの潜在的な弱点があります (マニュアルを参照)。したがって、以前に IGNORE キーワードなしでテストした場合は、これを使用する必要があります。
方法 3: INSERT を使用する … ON DUPLICATE KEY UPDATE:
3 番目のオプションは、INSERT … ON DUPLICATE KEY UPDATE
構文を使用することです。UPDATE 部分では、0+0 の計算などの無意味な (空の) 操作を何も実行しません (Geoffray は、MySQL 最適化エンジンがこの操作を無視するように id=id 割り当てを行うことを提案しています)。この方法の利点は、重複するキー イベントのみを無視し、他のエラーが発生した場合でも中断することです。
最後に、この投稿は Xaprb に触発されたものです。また、柔軟な SQL クエリの作成に関する彼の別の投稿も参照することをお勧めします。