17

列のある基本的なテーブルがあります。

  • id(プライマリとAI)
  • 名前(一意)

一意の列が存在しない場合は、行を挿入します。存在しない場合は、行を更新します...。

INSERT INTO pages (name, etc)
VALUES
  'bob',
  'randomness'
ON DUPLICATE KEY UPDATE
 name = VALUES(name),
 etc = VALUES(etc)

問題は、UPDATEを実行すると、id列のauto_increment値が上がることです。したがって、大量のUPDATEが実行されると、idauto_incrementが屋根を通り抜けます。

どうやらそれはバグでした:http://bugs.mysql.com/bug.php?id = 28781

...しかし、私は共有ホスティングのmySQL5.5.8でInnoDBを使用しています。

何年も前に解決策がない問題を抱えている他の人々: MYSQL重複挿入での自動インクリメントを防止、失敗した挿入でMySQL自動インクリメントが増加するのはなぜですか?

修正のアイデア?どういうわけかデータベースを間違って構成したのでしょうか?

******編集****:my.iniファイルにinnodb_autoinc_lock_mode = 0を追加すると問題が解決するようですが、共有ホスティングにはどのようなオプションがありますか?

******編集2******:OK、私の唯一の選択肢は、ストレージエンジンとしてMyISAMに変更することだと思います。メガmySQLの初心者なので、それが多くの問題を引き起こさないことを願っています。うん?

4

2 に答える 2

15

のこの動作をバイパスする方法はないと思いますINSERT ... ON DUPLICTE KEY UPDATE

UPDATEただし、 oneと oneの 2 つのステートメントを 1 つの transaction に入れることがINSERTできます

START TRANSACTION ;

UPDATE pages
SET etc = 'randomness'
WHERE name = 'bob' ;

INSERT INTO pages (name, etc)
SELECT 
      'bob' AS name
    , 'randomness' AS etc 
FROM dual 
WHERE NOT EXISTS
      ( SELECT *
        FROM pages p
        WHERE p.name = 'bob'
      ) ;

COMMIT ;
于 2012-02-08T08:32:54.300 に答える
-4

MySQL の on duplicate key 機能は、2 つの別々のクエリを実行するのとまったく同じです。1 つは選択し、もう 1 つは選択したレコードを更新するか、新しいレコードを挿入します。プログラムでこれを行うと、同じくらい高速であり、将来この問題を防ぐだけでなく、コードの移植性が向上します。

于 2012-02-08T08:18:20.480 に答える