2015-04-02 49 views
-1

我想要连续的数字序列作为主键。但由于某些原因,我不想使用Identity Seed或Sequence。SQL - 没有标识种子或序列的主键自动增量

以下是我的代码

Insert Into Items (ItemId, ItemName) 
Values((Select MAX(ItemId)+1 from Items), 'Some Name') 

当该表中的某些行这工作得很好。但是,当表项目中没有任何行时,MAX(itemId)给出NULL。

我希望MAX(itemId)在没有任何行时给出0。

+0

你也可以用计算列或触发器来处理这个问题。 – 2015-04-02 18:11:43

+0

@TabAlleman这会使问题进一步复杂化,因为我在C#应用程序中使用此数据库 – 2015-04-02 18:23:53

+0

为什么你不想使用什么工作?任何时候你试图推出你自己的标识类型的列,你都会遇到并发问题。一个身份是完全适合这种类型的事情。 – 2015-04-02 18:43:16

回答

2

的这两种方式要么将工作:

Insert Into Items (ItemId, ItemName) 
Values(COALESCE((Select MAX(ItemId)+1 from Items), 0), 'Some Name') 

Insert Into Items (ItemId, ItemName) 
Values(ISNULL((Select MAX(ItemId)+1 from Items), 0), 'Some Name') 

COALESCE返回它的第一个非空参数。 ISNULL如果第一个参数为NULL,则返回第二个参数。

+1

这主要是有效的,但并发性对于这种类型的代码是一个真正的问题。 – 2015-04-02 18:43:48