0

InvoiceNoに対する重複を防ぐ方法について混乱していますCompanyIdCompanyIdとのようなフィールドを持つ請求書プロジェクトを準備しましたInvNo。Company ID と InvoiceNo の両方を繰り返す必要があるため、どちらにも一意のキーはありません。以下の通り

CompanyID   InvNo
1           1
2           1
1           2
3           1
4           1
1           3

ここで、特定の CompanyId に対して重複する InvoiceNo で raiserror を発生させたいと考えています。これを実装するにはどうすればよいですか。重要: 一意のインデックスを作成した場合、重複レコードは許可されず、特定の CompanyId を除いて許可することが重要です

4

3 に答える 3

4

探しているのは、CompanyId と InvNo の両方で構成される Unique Constraint です。これにより、CompanyId = 1 に対して InvoiceNo = 1 を 1 つだけ作成でき、重複を挿入しようとすると自動的に RaisError が発生します。また、CompanyId = 2 に対して InvoiceNo = 1 を挿入できるため、(うまくいけば) 要件を満たすことができます。

これは、SQL Serverで行う方法です

ALTER TABLE YourTableName
ADD UNIQUE CONSTRAINT InvoiceIdMustBeUniqePerCompany (CompanyId, InvNo)
于 2009-10-20T15:26:25.690 に答える
0

あなたの質問はそれほど単純ではありませんが、私があなたが求めていると思うことをあなたが尋ねていると仮定すると、それは次のようになります...

CompanyID と NextInvoiceNo で構成される、NextInvoiceNumber というケーブルが必要です。新しい会社を作成すると、新しい NextInvoiceNumber が作成されるはずです。そのため、会社テーブルで挿入トリガーを使用することもできます...

特定の会社の次の請求書 ID を取得する関数を作成し、NextInvoiceNumber テーブルの値をインクリメントします (すべて共通のトランザクション内にあります)。

したがって、疑似コードでは、次のようなものです

    function GetNextInvoiceNo(CompanyIDCode){

begin transaction;
result = Select NextInvoiceNo from NextInvoiceNumber where CompanyID = CompanyIDCode;
update NextInvoiceNo set NextInvoiceNo = NextInvoiceNo + 1 where CompanyID = CompanyIDCode;
commit transaction;
return result;
}

この関数は、UDF としてデータベース サーバーに属するのが理想的です。

于 2009-10-20T15:34:15.400 に答える
0

サンプル データから、CompanyID + InvNo の組み合わせは一意であることがわかります。その場合は、これら 2 つのフィールドにキーを作成できます。特定の CompanyID に既に使用されている重複する InvNo を挿入しようとすると、エラーがスローされます。

create table Invoice
(
CompanyID int,
InvNo int,
Primary Key(CompanyID, InvNo)
)
于 2009-10-20T15:34:34.667 に答える