如何自动增加非主键? - SQL Server

时间:2010-04-08 15:28:25

标签: sql sql-server database tsql normalization

CREATE TABLE SupplierQuote
(
supplierQuoteID int identity (3504,2) CONSTRAINT supquoteid_pk PRIMARY KEY,
PONumber int identity (9553,20) NOT NULL
.
.
.
CONSTRAINT ponumber_uq UNIQUE(PONumber)
);

上面的ddl产生错误:

  

Msg 2744,Level 16,State 2,Line 1   指定了多个标识列   用于表'SupplierQuote'。只有一个   允许每个表的标识列。

我该如何解决?我希望PONumber能够自动增加。

6 个答案:

答案 0 :(得分:9)

如果在插入行时生成了SupplierQuoteId和PONumber,则将以锁步方式分配两个“标识”列(3504与9553一起使用,3506与9573一起使用,3508与9593一起使用等)。如果这个假设是正确的,那么你可能会将PONumber设为计算列,如下所示:

CREATE TABLE SupplierQuote 
( 
supplierQuoteID int NOT NULL identity (3504,2) CONSTRAINT supquoteid_pk PRIMARY KEY, 
PONumber AS (10 * supplierQuoteID - 25487)
. 
. 
. 
); 

我使supplierQuoteId NOT NULL,这确保了PONumber也将是NOT NULL。同样,您不再需要PONumber上的唯一约束,因为它始终是唯一的。 (如果需要计算列,可以在计算列上构建索引。)

答案 1 :(得分:7)

每个表不能有多个标识列。我认为你最好的选择是将PO数据拉入一个单独的表中,然后将两者与FK列联系起来。

SupplierQuote
-------------
supplierQuoteID (PK/identity)
purchaseOrderID (FK to PurchaseOrder.purchaseOrderID)
otherColumn1

PurchaseOrder
-------------
purchaseOrderID (PK/identity)
otherColumn1

答案 2 :(得分:2)

您无法解决问题 - 每个表只能有一个IDENTITY列。没办法,对不起。

唯一的“hackish”解决方案是拥有一个单独的表,只需拥有一个INT IDENTITY字段,并在插入时从该帮助程序表中获取最新值(例如使用触发器)。不是很漂亮,但它可能适合你。

答案 3 :(得分:1)

如果每个供应商报价只有一个PO ID,那么为什么不简单地使用供应商报价ID作为PO ID?

如果可以有多个,则必须具有带外键约束的sepapate表。您当然可以使用级联删除从此表中删除但如果您删除太多记录(导致锁定)这可能会很危险,或者如果已创建PO编号,我个人不想删除供应商报价,因为这意味着引用的物品实际上是买的。您不希望破坏实际购买的东西的记录。因为你可能会有多个POS(我得到六件事的报价,然后先购买其中三件,然后在下周购买另外两件)每份报价,因为很可能你会想要存储有关采购订单的具体信息,我推荐一张单独的表格。从长远来看,做任何其他事情都会给你带来麻烦。

答案 4 :(得分:0)

我想我会使用触发器填补“第二身份”。

答案 5 :(得分:0)

非身份栏中的规避自动增量。(MS SQL)我不认为这是最好的做法! JUst快速解决方案。

    INSERT INTO [dbo].[Employee]
           ([EmpID]
           ,[Name]
           ,[Salary]
           ,[Address]
           ,[datecoded])
     VALUES
           ( (select top 1 EmpID from dbo.Employee order by EmpID desc) + 1
           , 'name_value'
           , 123456
           ,'address_value'
           , GETDATE())