0

我对如何防止InvoiceNoCompanyId. 我刚刚准备了一个发票项目,其中包含CompanyIdInvNo. 两者都没有唯一键,因为公司 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 组成的唯一约束。这将让您只为 CompanyId = 1 创建一个 InvoiceNo = 1,如果您尝试插入重复项,则会自动 RaisError。它还可以让您插入 InvoiceNo = 1 for CompanyId = 2 从而(希望)满足您的要求

这就是我在 SQL Server 中的做法

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

你的问题并不是那么直截了当,但假设你在问我认为你在问什么,它会是这样的......

您需要一条名为 NextInvoiceNumber 的电缆,由 CompanyID 和 NextInvoiceNo 组成。创建一个新公司应该创建一个新的 NextInvoiceNumber - 所以也许在你的公司表上使用一个插入触发器......

编写一个函数来获取特定公司的下一个 Invoice 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 的组合是唯一的。如果这是真的,您可以在这两个字段上创建一个键,并在尝试插入已用于特定 CompanyID 的重复 InvNo 时,将引发错误。

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