0

ここでこの質問:

MySQL:INSERTIGNOREまたはONDUPLICATE KEY UPDATEを使用して、一意ではなく複数の列をチェックします

似ていますが、完全ではありません。

次のようなテーブルを使用して、ウォッチリストを作成しようとしています。

    recordId    |    itemId   |   userId    |    dateAdded

recordIdは唯一のunique列であり、自動インクリメントIDフィールドです。

itemId、userId、およびdateAddedは個別に複製できますが、完全に複製することはできません。

したがって、ユーザーがすでにウォッチリストにアイテムを追加している場合は、dateAddedを更新するだけで済みます。

したがって、行には同じuserIdが何度も含まれる場合があり(ユーザーが複数のアイテムを「監視」したい場合があるため)、itemIdが何度も含まれる場合があります(同じアイテムが多くのユーザーによって「監視」される場合があるため)が、両方の組み合わせすでに存在するレコードと一致するuserIdとitemIdにより、更新が発生するはずです。

これを行う単一のステートメントの方法はありますか、またはuserId = & postingUser & and itemId = & requestedId &挿入を試みる前にデータベースに問い合わせる必要がありますか?

4

1 に答える 1

1

これを行う方法は次のとおりです。

insert into <tablename> (itemId, userId)
values (?, ?)
on duplicate key update dateAdded = now();

ここで、?は挿入する新しい値を表します

これは、次の一意のインデックスを定義していることを前提としています(itemId, userId)

CREATE TABLE <table> (
  `recordId` int(11) NOT NULL AUTO_INCREMENT,
  `itemId` int(11) DEFAULT NULL,
  `userId` int(11) DEFAULT NULL,
  `dateAdded` timestamp,
  PRIMARY KEY (`recordId`),
  UNIQUE KEY itemuser (`itemId`,`userId`)
) ENGINE=InnoDB;

これがどのように機能するか:

  • 行を挿入しようとすると、MySQLはキーの競合をチェックします
  • の組み合わせに対して一意のキーを作成したため(itemId, userId)、これがチェックされます
  • 競合がない場合、MySQLは先に進んで行を挿入します
  • on duplicate key競合がある場合、MySQLは句にフォールバックし、dateAdded列の値を更新します
于 2012-04-05T15:49:42.420 に答える