0

たとえば、次のテーブルがあります。

ユーザー ID(int) | カード ID(int) | デッキ(int)

   1841     |            14       |         1
   1841     |            14       |         1

デッキ列の int 値は、値として常に 1 または 2 を取ることが定義されています (1 はデッキにあることを示します)。上記の例に示すように、カード ID はユーザーに対して一意ではありません (これは、ユーザーが 2 枚のカード 14 を持っていることを示します)。デッキから 14 枚のカードを 1 枚取り除き、もう 1 枚が残る場合はどうすればよいでしょうか。適切なSQLコマンドは何ですか。UPDATEを試しましたが、

4

2 に答える 2

1

更新クエリの最後に制限を定義できます

update [table name] set Deck=2 where User_ID=1841 and Card_id=14 limit 1;
于 2013-08-03T02:50:19.247 に答える
0

基本的に、特定の行を参照する方法がありません。そのような参照がアプリ​​ケーションにとってどれほど重要であるかにもよりますが、ほとんどの場合、そのような状況を許可することはお勧めできません。これには多くの解決策があります。たとえば、

1) 通常、すべての行には一意の OID または ROWID フィールドが含まれており、"SELECT * FROM TABLE" では表示されませんが、暗黙的に要求された場合は使用できます。使用するデータベース エンジンに応じて、たとえば PostgreSQL で試してみてください

SELECT OID, * FROM TABLE WHERE OID = 'somevalue'

これは通常、テーブルに UNIQUE を強制したくない場合に使用されますが、誤った入力が後で表示された場合に対処します。

2) 自動インクリメンタル (DB マニュアルを参照) などの ID 列を追加し、更新して一意の ID を含めることができます。

ALTER TABLE table_name ADD column_name column-definition;

3) 自己インクリメントの「現在の合計」を使用できます。MySQL では多かれ少なかれ次のようになります。

SET @runtot:=0;
SELECT *, (@runtot := @runtot + 1) AS rt FROM table WHERE rt='somevalue'

(これは毎回計算を行うため、おそらく非効率的です)

4)前の回答で説明したように LIMIT を使用できます

5) 一意の ID を持つ別のテーブルを結合し、結果のリレーションを更新するか、クエリを組み合わせて静的 VIEW を作成して使用することができます

6) SELECT を動的に割り当てられた値 (RAND() や NOW() など) とともに使用できます。使用する関数とその使用方法によっては、テーブル全体で一意の識別子が作成されない可能性があります

7) 上記のソリューションを 2 つ以上組み合わせる

..そしておそらく他の多くのソリューション。とにかく、通常、いくつかの UNIQUE 制約で使用される "Id" 列があります。

于 2013-08-03T06:32:37.607 に答える