默认值为SQL Server表列中的GUID



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

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

这里正在发生一些事情。

如果您只是使用以下查询添加一个具有默认值的列:

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()

没有理由最终得到00000000-0000-0000-0000-000000000000,除非有什么没有被提及的事情去做或改变它

现在,如果我们把这个问题放在一边,就不应该考虑使用UNIQUEIDENTIFIER作为主键。GUID为:

  • 不窄
  • 随机的,尽管可以使用顺序GUID

如果出于某些原因,您需要一些随机和唯一的东西,例如表中的GUID,您可以保留此列而不使用PK,也可以在PK时添加一个额外的唯一和顺序ID列(带标识的bigint)。

样本数据:

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

编辑以绕过软件插入问题(请参阅导致合并索引冲突的00000000-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,也不会尝试自动插入某些内容。

在SQL server中无法获取默认值,请使用以下转换值来获取default guid

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

结果

00000000-0000-0000-0000-000000000000

我花了很长时间试图弄清楚这一点。派生列似乎需要以下格式才能成为GUID。(DT_GUID)"{00000000-0000-0000-000000000000}"

相关内容

  • 没有找到相关文章

最新更新