0

多くの行を持つ非常に大きなテーブルがあり、すべての行には特定の日のすべてのユーザーの統計があります。そして明らかに、私は将来の統計を持っていません。だから私が使用する統計を更新するには

UPDATE Stats SET Visits=@val WHERE ... a lot of conditions ... AND Date=@Today

しかし、行が存在しない場合はどうなるでしょうか。私は使用する必要があります

INSERT INTO Stats (...) VALUES (Visits=@val, ..., Date=@Today)

行が存在するかどうかを確認するにはどうすればよいですか? COUNT(*) と違う方法はありますか?

テーブルを空のセルで埋めると、何十万行ものメガバイトが必要になり、データは保存されません。

4

4 に答える 4

2

SQL Server 2008 以降を使用している場合はMERGE、2008 バージョンで導入されたステートメントも調査する必要があります。

于 2010-06-15T05:08:25.020 に答える
1

UPDATE を試してから、@@ROWCOUNT = 0 の場合は INSERT を試します

UPDATE Stats SET Visits=@val WHERE ... a lot of conditions ... AND Date=@Today
IF @@ROWCOUNT = 0
   INSERT INTO Stats (...) VALUES (Visits=@val, ..., Date=@Today)

または、TRY/CATCH 内で INSERT を試行し、失敗した場合は UPDATE を試行します。

私は最初にテストしません

于 2010-06-15T04:47:59.373 に答える
0

そのような場合に私がする傾向があるのは、次のことを実行することです (私自身が DB2 の人間なので、疑似コードです)。

try:
    INSERT
catch already-exists:
    try:
        UPDATE
    catch anything:
        generate error

行がある可能性が高い場合は、逆の順序で実行できます。

try:
    UPDATE
catch not-there:
    try:
        INSERT
    catch anything:
        generate error

データベースはテストと実行の間で変更される可能性があるため、DBMS で最初にテストすることはありません (「許可を求めるよりも許しを求めるほうがよい」という原則)

于 2010-06-15T04:48:54.520 に答える
0

残念ながら、SQL Server には、一部の DB エンジンのような "INSERT OR UPDATE" コマンド (私が知っている) はありません。つまり、最初に行を確認するか、他の回答が推奨するようにエラーをキャッチする必要があります。行に人為的な主キーがあることを願っています。そのため、最初にすべての WHERE 条件を使用してそのキーをクエリし、行が返された場合は を実行しUPDATE ... WHERE key = ...、そうでない場合は INSERT を実行します。そうすれば、クエリ全体を 2 回実行することはありません。

于 2010-06-15T04:48:58.480 に答える