SQL Server表列中的默认值为GUID

时间:2015-12-16 08:30:13

标签: sql-server guid

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

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

4 个答案:

答案 0 :(得分:19)

这里发生了一些事情。

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

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,并且还会添加newid()以及此ALTER:

ALTER TABLE #Test ADD [GIANGGUID] uniqueidentifier NOT NULL DEFAULT NEWID()-- PRIMARY KEY;
  • 使用您的查询,将为新行和现有行插入newid()。
  • 使用上面的其他查询,您将获得NULL或newid()。

没有理由以“{1}}结束”,除非未提及的内容做或改变它。

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

  • 不窄
  • 随机虽然可以使用顺序GUID。

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

示例数据:

00000000-0000-0000-0000-000000000000

编辑以解决软件插入问题...... (请参阅GUID of 00000000-0000-0000-0000-000000000000 causing merge index violation

重命名表格:

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

添加新列:

EXEC sp_rename 'dbo.test', 'test_data'

或:

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

创建没有GIANGGUID的视图:

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

当软件进行插入时,它不会看到GIANGGUID,并且它不会尝试自动插入内容。

答案 1 :(得分:1)

SQL server 中没有办法获取默认值,使用下面的转换值获取default guid

select CAST( cast(0 as binary) as uniqueidentifier)

结果

00000000-0000-0000-0000-000000000000

答案 2 :(得分:0)

在使用GUId作为主要内容之前,您应该看一下这篇文章:

大多数情况下,使用GUID作为SQL Server中的主键是不好的。

答案 3 :(得分:0)

我花了很长时间试图解决这个问题。您似乎需要以下格式才能将派生列作为GUID。 (DT_GUID)“{00000000-0000-0000-0000-000000000000}”