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能够自动增加。
答案 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())