复合主键的SQL标识

时间:2013-05-28 18:08:03

标签: sql sql-server sql-server-2008 primary-key identity-column

首先,对不起我的英语。我试图找到这个问题的答案,但我真的不知道如何表达自己。

如果它是重复的,请关闭它并让我知道答案。

我有一个表来存储客户购物车的每个项目的数据。结构是:

表格 - tmpShoppingCartItem

tmpShoppingCart_ID  int FK from tmpShoppingCart
ID                  int PK, Ident 1,1
StoreSKU_ID         int FK from StoreSku
Quantity            int 
Enabled             bit 

ID是种子= 1的标识。但是当我开始插入数据时,它看起来像:

tmpShoppingCart_ID        ID          ....
1                         1
1                         2
1                         3
1                         4

直到这里,没关系,但是当它是一个新的购物车时,它看起来像:

tmpShoppingCart_ID        ID          ....
2                         5
2                         6
3                         7
4                         8

ID列仍然播种1。

我想知道tmpShoppingCart_ID更改时是否(以及如何)重置种子计数器,例如:

tmpShoppingCart_ID        ID          ....
1                         1
1                         2
1                         3
1                         4
2                         1
2                         2
3                         1
3                         2
3                         3
3                         4
3                         5
4                         1

感谢您的时间。

2 个答案:

答案 0 :(得分:3)

用作主键时的标识列应该是顺序的,不能在表中重复。首先,您需要将temShoppingCart_ID和ID都设为唯一的PK以防止重复。其次,您将无法使用IDENTITY函数,而是在应用程序中为给定tempShoppingCart_ID插入的每一行使用一个计数器。

在我看来,将ID保存为当前的标识列。添加名为LineID的第二列,并为每条记录创建该增量。

答案 1 :(得分:2)

您无法使用自动递增字段执行此操作。如果你想这样做,你必须根据你编写的过程编写一个触发器来弹出字段。该过程必须确保它包含多个行插入并且可以处理竞争条件。你想做什么?您是否打算让客户重新订购购物车ID。不需要看到id,所以如果第一个是1或7则无关紧要。

我想指出虽然DBCC CHECKIDENT([Table_Name],RESEED,0)在技术上可行,但它要求用户是sys_admin或db_owner或db_ddladmin。这些都不是应该分配给从应用程序登录以进行数据输入的用户的角色。