添加新的主键列

时间:2011-05-27 12:25:55

标签: sql-server

SQL SERVER,我正在使用一个使用guid作为键而不是int的表,但对于我正在进行的集成,我需要它是一个int。所以,我想写一些会创建ID列的内容(如果它不存在)并使用下一个最高ID填充它。我不是很确定如何做到这一点。有没有人有代码可以做到这一点?

我试过这个,但更新不起作用,因为它们是空的

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'c_Product'AND COLUMN_NAME = 'ProductId')
BEGIN
ALTER TABLE c_Product ADD ProductId INT
END
UPDATE c_Product SET ProductId = (SELECT Max(ProductId) + 1 END FROM c_Product)

2 个答案:

答案 0 :(得分:3)

我在这里密集吗?你不只是想做:

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'c_Product'AND COLUMN_NAME = 'ProductId')
BEGIN
    ALTER TABLE c_Product ADD ProductId INT IDENTITY(1,1) not null
END

将为所有现有行分配标识值,然后在插入新行时提供新数字。

答案 1 :(得分:0)

好的,所以你添加一个名为ProductId的INT类型的列,顺便说一下,它是NULL。 SQL Server将值存储在三种状态之一中。 TRUE,FALSE,NULL。现在记住Null不是空的,它不是零,它不是真的,也不是假的。它几乎从未发生过,也不存在。明白这点?好的,所以在'new'创建的列中具有此最高值的行是---- NULL。那么什么是MAX(PorductId)?空值。什么是Null + 1?空值。因此,除非你在任何地方将一个值设置为1,否则你将永远陷入永无止境的循环中。

回到桌面设计。使用GUID作为主键,是非常糟糕的不,不!这将严重影响您桌子的性能。除非您编写的应用程序必须通过多个服务器和平台加入,否则请远离使用GUID作为主键。很长的解释,但基本上所有插入都是随机的,然后索引页面拆分几乎与每个插入一起发生,并且搜索也更慢,并且每行仅使用16个字节用于PK列,这不是很好。然后将其添加到其他每个NC索引中,坏坏坏。如果可以,请改变您的表格结构。使用和int。