8

playerspointsショップIDとプレーヤーのID、およびプレーヤーのポイントを含むテーブルがあります。

  SHOP_ID   |     PLAYER_ID     |  POINTS
  ----------------------------------------
      1     |        7          |     66
      2     |        4          |     33

私がやりたいのは、ショップからショップへのポイントの移動です。

  • 問題:ショップIDとプレーヤーIDが一意のインデックスを形成します。
  • 私がやりたいのは、重複キーの更新で、失敗させるのではなく、一方のエントリのポイントをもう一方のエントリに追加し、「from」エントリを削除することです。

何かのようなもの:

UPDATE `playerspoints`
SET `boardId`=$to
WHERE `boardId`=$from
ON DUPLICATE KEY UPDATE `points`=.... 

わかりますか?

4

2 に答える 2

3

エリア内の競合する1つの行のコンテキストでのみ変更を行うことができますON DUPLICATE KEY。さらに、これは私が知る限り、INSERTステートメントのプロパティです。

必要なのは、天びんからの加算と減算を記録し、手動またはトリガーを使用してそれらを表にする単純な元帳です。

たとえば、最も簡単なアプローチは次のとおりです。

INSERT INTO points_adjustments (boardId_from, boardId_to, points)
  VALUES (?, ?, ?)

これは、エントリのペアとしてより簡単に表すことができます。

INSERT INTO points_adjustments (boardId, points)
  VALUES (?, ?)

+ nポイントに1つのエントリを追加し、-nに一致するエントリを追加します。いつでもを使用してバランスをとることができますSUM(points)。これをでまとめてVIEW取得を容易にするか、必要に応じて、トリガーを使用して合計を別のテーブルの列に非正規化することができます。

単純なトリガーは、影響を受けるそれぞれに対して次のステートメントを発行しますboardId

INSERT INTO balances (boardId, points) VALUES (?, ?)
  ON DUPLICATE KEY SET points=points+VALUES(points)

これにより、最初からキーの衝突が回避され、発生したトランザクションの監査可能な記録が提供されます。

いずれにせよ、これをすべて自動的に行うには、おそらくトリガーを使用する必要があります。

サードパーティの編集

ドキュメントから INSERT...ON DUPLICATEKEYUPDATEステートメント

一般に、複数の一意のインデックスを持つテーブルでON DUPLICATEKEYUPDATE句を使用しないようにする必要があります。

于 2012-11-20T04:45:36.517 に答える
0

いいえ。MySQLでは制約違反時にレコードを削除することはできません。差し迫った制約違反をチェックする更新前トリガーを実行することもできますが、それでも(5.1以降)同じテーブルのデータを変更することはできません(この場合、とにかく無限のループが発生する可能性があります)。

タッドマンの答えの前に半分だけ終わった。私は彼の考えが個人的に好きです。

于 2012-11-20T04:46:40.867 に答える