当前位置:  开发笔记 > 编程语言 > 正文

SQL Server表列中的默认值为GUID

如何解决《SQLServer表列中的默认值为GUID》经验,为你挑选了1个好方法。

我需要在已存在的表中添加一列,并将其设置为主键.我使用其他软件添加新数据.为什么列GIANGGUID具有值00000000-0000-0000-0000-000000000000

ALTER TABLE dbo.Test 
   ADD [GIANGGUID] UNIQUEIDENTIFIER DEFAULT NEWID() PRIMARY KEY;

Julien Vavas.. 22

这里发生了一些事情.

如果您只是使用此查询添加具有默认值的列:

ALTER TABLE #Test ADD [GIANGGUID] uniqueidentifier DEFAULT NEWID();

您将获得现有列的NULL值,因为允许NULL并且newid()用于新插入的行:

id  name    GIANGGUID
0   A       NULL
1   B       NULL
2   C       NULL

现在,如果添加带有NOT NULL的新列:

ALTER TABLE #Test ADD [GIANGGUID] uniqueidentifier NOT NULL DEFAULT NEWID();

由于该列不能为NULL,因此使用DEFAULT约束并为每个现有行插入newid():

id  name    GIANGGUID
0   A       52C70279-B3A4-4DE6-A612-F1F32875743F
1   B       3005D9BE-5389-4870-BAA9-82E658552282
2   C       E50FDD26-A8FD-43BD-A8F0-3FDA83EFF5D9

添加主键时会发生同样的情况,因为PK不能为NULL,并且在此ALTER中也会添加newid():

ALTER TABLE #Test ADD [GIANGGUID] uniqueidentifier NOT NULL DEFAULT NEWID()-- PRIMARY KEY;

使用您的查询,将为新行和现有行插入newid().

使用上面的其他查询,您将获得NULL或newid().

没有理由最终,00000000-0000-0000-0000-000000000000除非没有提到的东西做或改变它.

现在,如果我们不考虑这个问题,你不应该考虑使用UNIQUEIDENTIFIER作为主键.GUID是:

不窄

随机虽然可以使用顺序GUID.

如果出于某些原因需要随机且独特的内容(例如表中的GUID),则可以在没有PK的情况下保留此列,并在PK时添加额外的唯一和顺序ID列(bigint with identity).

样本数据:

CREATE TABLE #Test(id int, name varchar(10));
INSERT INTO #Test(id, name) values
    (0, 'A')
    , (1, 'B')
    , (2, 'C');

编辑以解决软件插入问题...(请参阅导致合并索引违规的00000000-0000-0000-0000-000000000000的GUID)

重命名表格:

EXEC sp_rename 'dbo.test', 'test_data'

添加新列:

ALTER TABLE dbo.Test_data ADD [GIANGGUID] UNIQUEIDENTIFIER DEFAULT NEWID() PRIMARY KEY;

要么:

ALTER TABLE dbo.Test_data ADD [GIANGGUID] bigint identity(0, 1) PRIMARY KEY;

创建一个没有GIANGGUID的视图:

CREATE VIEW dbo.test AS
    SELECT col1, col2, ... FROM dbo.test_data

当软件进行插入时,它不会看到GIANGGUID,也不会尝试自动插入.



1> Julien Vavas..:

这里发生了一些事情.

如果您只是使用此查询添加具有默认值的列:

ALTER TABLE #Test ADD [GIANGGUID] uniqueidentifier DEFAULT NEWID();

您将获得现有列的NULL值,因为允许NULL并且newid()用于新插入的行:

id  name    GIANGGUID
0   A       NULL
1   B       NULL
2   C       NULL

现在,如果添加带有NOT NULL的新列:

ALTER TABLE #Test ADD [GIANGGUID] uniqueidentifier NOT NULL DEFAULT NEWID();

由于该列不能为NULL,因此使用DEFAULT约束并为每个现有行插入newid():

id  name    GIANGGUID
0   A       52C70279-B3A4-4DE6-A612-F1F32875743F
1   B       3005D9BE-5389-4870-BAA9-82E658552282
2   C       E50FDD26-A8FD-43BD-A8F0-3FDA83EFF5D9

添加主键时会发生同样的情况,因为PK不能为NULL,并且在此ALTER中也会添加newid():

ALTER TABLE #Test ADD [GIANGGUID] uniqueidentifier NOT NULL DEFAULT NEWID()-- PRIMARY KEY;

使用您的查询,将为新行和现有行插入newid().

使用上面的其他查询,您将获得NULL或newid().

没有理由最终,00000000-0000-0000-0000-000000000000除非没有提到的东西做或改变它.

现在,如果我们不考虑这个问题,你不应该考虑使用UNIQUEIDENTIFIER作为主键.GUID是:

不窄

随机虽然可以使用顺序GUID.

如果出于某些原因需要随机且独特的内容(例如表中的GUID),则可以在没有PK的情况下保留此列,并在PK时添加额外的唯一和顺序ID列(bigint with identity).

样本数据:

CREATE TABLE #Test(id int, name varchar(10));
INSERT INTO #Test(id, name) values
    (0, 'A')
    , (1, 'B')
    , (2, 'C');

编辑以解决软件插入问题...(请参阅导致合并索引违规的00000000-0000-0000-0000-000000000000的GUID)

重命名表格:

EXEC sp_rename 'dbo.test', 'test_data'

添加新列:

ALTER TABLE dbo.Test_data ADD [GIANGGUID] UNIQUEIDENTIFIER DEFAULT NEWID() PRIMARY KEY;

要么:

ALTER TABLE dbo.Test_data ADD [GIANGGUID] bigint identity(0, 1) PRIMARY KEY;

创建一个没有GIANGGUID的视图:

CREATE VIEW dbo.test AS
    SELECT col1, col2, ... FROM dbo.test_data

当软件进行插入时,它不会看到GIANGGUID,也不会尝试自动插入.

推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有