sql >> データベース >  >> RDS >> Mysql

MySQLで「存在しない場合は挿入」するにはどうすればよいですか?

    INSERT IGNORE INTO tableを使用します 。

    INSERT … ON DUPLICATE KEY UPDATEもあります 構文。説明はにあります。 13.2.6.2 INSERT ... ON DUPLICATEKEYUPDATEステートメント

    bogdan.org.ua Googleのウェブキャッシュ

    2007年10月18日

    まず、最新のMySQLの時点では、タイトルに示されている構文は使用できません。しかし、既存の機能を使用して期待されることを達成するための非常に簡単な方法がいくつかあります。

    考えられる解決策は3つあります。INSERTIGNORE、REPLACE、またはINSERT…ON DUPLICATEKEYUPDATEを使用します。

    テーブルがあると想像してください:

    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からtranscriptsmeta-dataをインポートする自動パイプラインがあり、さまざまな理由により、実行のどのステップでもパイプラインが壊れている可能性があると想像してください。したがって、次の2つを確認する必要があります。

    1. パイプラインを繰り返し実行しても、データベースは破壊されません
    1. 「主キーの重複」エラーが原因で繰り返し実行が終了することはありません。

    方法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リファレンスマニュアルからの引用です。「IGNOREキーワードを使用する場合、INSERTステートメントの実行中に発生するエラーは代わりに警告として扱われます。たとえば、IGNOREがない場合、既存のUNIQUEインデックスまたはPRIMARYKEYを複製する行テーブルの値により、キーの重複エラーが発生し、ステートメントが中止されます。」)レコードがまだ存在しない場合は、レコードが作成されます。

    この2番目の方法には、他の問題が発生した場合にクエリを中止しないなど、いくつかの潜在的な弱点があります(マニュアルを参照)。したがって、以前にIGNOREキーワードなしでテストした場合は、これを使用する必要があります。

    方法3:INSERTを使用する…重複するキーの更新時:

    3番目のオプションは、INSERT … ON DUPLICATE KEY UPDATEを使用することです。 構文であり、UPDATEの部分では、0 + 0の計算など、意味のない(空の)操作は何もしません(Geoffrayは、MySQL最適化エンジンにid =idを割り当てて、この操作を無視することをお勧めします)。この方法の利点は、duplicatekeyイベントのみを無視し、他のエラーで中止することです。

    最後の通知として:この投稿はXaprbに触発されました。また、柔軟なSQLクエリの作成に関する彼の他の投稿を参照することをお勧めします。



    1. PostgreSQLのキャッシングの概要

    2. キーワード'with'の近くの構文が正しくありません...前のステートメントはセミコロンで終了する必要があります

    3. android.database.CursorIndexOutOfBoundsException

    4. PostgreSql:横方向結合を使用した行へのJson配列