0

プログラムのインスタンスが2つあり、データベース内の1つのテーブルにアクセスしています。
テーブルpoints

game    |  player1  |  player2
--------|-----------|-----------
Poker   |    5      |   
Skat    |    8      |    4
Bridge  |           |   10

プレーヤー1が最初のインスタンスを使用して自分のポイント(ポーカーなど)をテーブルに保存したい場合は、ポーカーがすでに存在するかどうかを確認する必要があります。そうでない場合、ポーカーはplayer1のポイントと一緒に挿入されます。ただし、ポーカーがすでにplayer2によって挿入されている場合は、player1のポイントのみを挿入する必要があります(行のみを変更する必要があります)。

あらゆる種類のゲームが一度だけ挿入され、この場合はポイントのみが挿入(変更)されることをどのように確認できますか?コラムはユニークでなければならない
と思います。 私の解決策は、最初にゲームの種類を照会し、行数を確認することです。0行の場合は、ゲームとポイントを挿入します。すでに1行の場合は、ポイントのみを挿入します。 しかし、最初にクエリを実行せずに、より良い/より高速なソリューションはありますか?game


4

4 に答える 4

4
INSERT INTO points (game,player1) VALUES ('Poker',5)
    ON DUPLICATE KEY UPDATE player1=5;

詳細については、MySQLのドキュメントを参照してください:INSERT ... ONDUPLICATEKEY構文

于 2012-04-11T21:28:04.870 に答える
0

挿入を2つのステートメントに分割します。これが機能するには、「game」が一意の列である必要があります。つまり、2つの値を同じにすることはできません。

INSERT INTO 'game' VALUES('Poker',null,null);
UPDATE 'game' SET player1='5' WHERE 'game'='POKER';

最初の行は、それがすでに存在する場合は何にも影響しません。これは、一意の制約によってそれが妨げられるためです。

于 2012-04-11T21:24:37.790 に答える
0

replace into 構文を使用します。データベース テーブルに対して一意の制約を作成できることに注意してください。

replace into hereについてお読みください。一意の制約については、こちらをご覧ください。

于 2012-04-11T21:32:10.313 に答える
0
 REPLACE INTO points (game,player1) VALUES ('Poker',5);
于 2012-04-11T21:39:17.840 に答える