3

IDENTITY フィールドは知っていますが、問題を解決するために使用できないと感じています。

複数のクライアントがいるとしましょう。各クライアントには複数の注文があります。各クライアントは、注文に固有の順番に番号を付ける必要があります。

テーブル構造の例:

Orders:
OrderID | ClientID | ClientOrderID | etc...

このテーブルの行の例は次のとおりです。

OrderID | ClientID | ClientOrderID | etc...
1 | 1 | 1 | ...
2 | 1 | 2 | ...
3 | 2 | 1 | ...
4 | 3 | 1 | ...
5 | 1 | 3 | ...
6 | 2 | 2 | ...

クライアントのMAX ClientOrderIDを取得し、その値をINSERTに使用するのが単純な方法であることはわかっていますが、これは同時実行の問題の影響を受ける可能性があります。トランザクションを使用することを検討していましたが、これに使用できる最も広い分離範囲がよくわかりません。LINQ to SQL を使用しますが、それは関係ないと感じています。

4

4 に答える 4

2

私が間違っている場合は誰かが私を修正しますが、MAX() 呼び出しが挿入と同じステップにある限り、同時実行性に問題はありません。

だから、あなたはできませんでし

select @newOrderID=max(ClientOrderID) + 1
from orders
where clientid=@myClientID;

insert into ( ClientID, ClientOrderID, ...)
values( @myClientID, @newOrderID, ...);

しかし、あなたはすることができます

insert into ( ClientID, ClientOrderID, ...)
select @myClientID, max(ClientOrderID) + 1, ...
from orders
where clientid=@myClientID;

OrderID は ID 列であると想定しています。

繰り返しますが、これについて間違っている場合はお知らせください。できればURL付き

于 2009-03-23T22:18:57.877 に答える
1

これはデータを保存するための奇妙な方法ですが、それが必要であると仮定すると、組み込みで使用できるものは何もありません。

Max(ClientOrderID) の提案は単純明快で、実装が非常に簡単です (John MacIntyre のアドバイスに従ってください)。数千の注文があるテーブルでは、おそらく問題なく機能します。テーブルが大きくなるにつれて、このアプローチはもちろん遅くなります。

Nick DeVore のルックアップ テーブルの提案は、実装が少し面倒ですが、データの増加による影響はほとんどありません。

ClientOrderID が実際に必要な場所/時期に応じて、必要に応じて次のように id を計算できます。

SELECT *,
ROW_NUMBER() OVER(ORDER BY OrderID) AS ClientOrderID
FROM Orders
WHERE ClientID = 1

これは、ClientOrderID が OrderID と同じ順序であることを前提としています。実際に ID を永続化しないと、他の何かへのキーとして使用するのは厄介です。このアプローチは、データの増加による影響を受けるべきではありません。

于 2009-03-23T22:33:15.580 に答える