Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 添加新的主键列_Sql Server - Fatal编程技术网

Sql server 添加新的主键列

Sql server 添加新的主键列,sql-server,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

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)

好的,那么您添加了一个名为ProductId的INT类型的列,顺便说一下,它是NULL。SQL Server以三种状态之一存储值。真、假、空。现在记住Null不是空的,它不是零,它不是真的,它不是假的。这几乎是一件从未发生、也不存在的事情。明白了吗?好的,那么您在“新建”列中具有最高值的行是----NULL。那么最大产量是多少?无效的什么是Null+1?无效的因此,除非在任何地方将一个值设置为1,否则将永远陷入这个永无止境的循环中


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

我在这里很密集。你不仅仅是想做:

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

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

因此,基本上您希望将主键从
GUID
转换为自动递增的(
identity
)。是吗?是的,但我想在程序执行期间这样做。我们可以重申一下“如果INSERT没有给出值,我希望int列自动填充”。还有第二个问题“我能把它作为主键吗?”?是否有保留现有值的要求?有什么隐含的命令吗?你能把这个新列作为一个标识吗?如果你需要帮助,那么我们需要知道你在问什么。。