Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.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表列中的GUID_Sql Server_Guid - Fatal编程技术网

Sql server 默认值为SQL Server表列中的GUID

Sql server 默认值为SQL Server表列中的GUID,sql-server,guid,Sql Server,Guid,我需要向已经存在的表中添加一列,并将其设置为主键。我使用其他软件添加新数据。为什么列GIANGGUID的值为00000000-0000-0000-0000-000000000000 ALTER TABLE dbo.Test ADD [GIANGGUID] UNIQUEIDENTIFIER DEFAULT NEWID() PRIMARY KEY; 在将GUId用作主要GUId之前,您应该先看看以下文章: 大多数情况下,在SQL Server中将GUID用作主键是一种错误的做法。这里

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

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

在将GUId用作主要GUId之前,您应该先看看以下文章:


大多数情况下,在SQL Server中将GUID用作主键是一种错误的做法。

这里发生了一些事情

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

ALTER TABLE #Test ADD [GIANGGUID] uniqueidentifier DEFAULT NEWID();
现有列的值为NULL,因为允许NULL,新插入的行的值为newid():

id  name    GIANGGUID
0   A       NULL
1   B       NULL
2   C       NULL
现在,如果添加一个非空的新列:

ALTER TABLE #Test ADD [GIANGGUID] uniqueidentifier NOT NULL DEFAULT NEWID();
由于列不能为NULL,因此使用默认约束,并为每个现有行插入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 TABLE #Test ADD [GIANGGUID] uniqueidentifier NOT NULL DEFAULT NEWID()-- PRIMARY KEY;
  • 查询时,将为新行和现有行插入newid()
  • 对于上面的其他查询,您将得到NULL或newid()
没有理由以
00000000-0000-0000-0000-0000-000000000000结束,除非有没有提到的东西去做或改造它

现在如果我们把这个问题搁置一边,你就不应该考虑使用单一标识符作为主键。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');
编辑以绕过软件插入问题…(请参阅)

重命名该表:

EXEC sp_rename 'dbo.test', 'test_data'
添加新列:

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

创建没有GIANGUID的视图:

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

当软件执行插入操作时,它不会看到GIANGGUID,也不会尝试自动插入内容。

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

无法在SQL server中获取默认值,请使用下面的转换值获取默认GUID

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

00000000-0000-0000-0000-000000000000

问题是什么???为什么列GIANGGUID的值为00000000-0000-0000-0000-000000000000?大多数情况下,在SQL Server中使用GUID作为主键是一种错误的做法。请参阅此答案,我们需要确切了解如何插入包含00000000-0000-0000-0000-000000000000 GUID的行。以及在添加默认值之前还是之后插入。从你的问题来看,这并不清楚。(而且,如果使用GUID作为主键,则需要小心;有很多变量需要考虑,但是<代码> NexSaleIdILIDID)(/Cord>)可能比<代码> NeWID()/代码>更好。如果是,哪一个?不管怎样,您的insert看起来都是显式插入该值,因此默认值永远不会出现在其中。“默认值将仅应用于新插入的行。”我认为这取决于该列是否声明为可空。我不知道您是否真的可以说“大多数时候”这是一种不好的做法。每种方法都有其优点和缺点,如果您将guid作为主键并在该字段上使用聚集索引(默认情况下,在创建主键时),您可以通过使用SQL Server搜索“guid或int主键”来发现大量的博客文章落在任何一方随着时间的推移,这将导致性能问题。我添加的列是GIANGGUID并为其设置主键,但当我添加几行数据时,第一行值是00000000-0000-0000-000000000000,下一行将无法插入,因为它与主键重复,问题是当我设置默认值或绑定为newid()时或newsequentialid(),主键的值为00000000-0000-0000-0000-000000000000。默认情况下,我的表没有主键。如何插入新行?您的代码可能会将其替换为000000。我没有编辑代码的权限。我只允许在跟踪表中添加一列is GUID用于插入新行的代码可能会添加0000。什么软件用于在表中插入行?我添加了一个新字段GIANGGUID,它不依赖于软件来插入数据,因为它由newid()或newsequentialid()自动生成
00000000-0000-0000-0000-000000000000