2011-05-27 70 views
-1

SQL SERVER,我正在使用一个表使用guid而不是一个整数,但对于我正在进行的整合,我需要它是一个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) 
+1

所以,基本上你想把主键从'GUID'转换成自动增加的('IDENTITY')。对? – 2011-05-27 12:37:38

+0

没错,但我想在程序执行过程中执行 – user204588 2011-05-27 12:46:01

+1

我们可以重申这一点:“如果INSERT没有给出值,我想要一个int列自动填充”。还有第二个问题“我可以把它作为主键”吗?是否有任何要求保留现有的价值?任何暗示的排序?你可以让新的列成为IDENTITY吗?如果你需要帮助,那么我们需要知道你在问什么。 – gbn 2011-05-27 12:55:39

回答

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 

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

+0

太棒了,谢谢你的帮助 – user204588 2011-05-27 14:05:09

0

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

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