我有这张桌子:
CREATE TABLE [dbo].[SandTable](
[Id] [uniqueidentifier] NOT NULL,
[Date] [date] NULL,
CONSTRAINT [PK_SandTable] PRIMARY KEY)
ALTER TABLE [dbo].[SandTable] ADD CONSTRAINT [DF_SandTable_Id] DEFAULT (NEWID()) FOR [Id]
问题与使用NEWID()和NEWSEQUENTIALID()无关。
我使用linqPad来测试表格。
SandTables.InsertOnSubmit(new SandTable
{
// I don't provide any value for Id
Date = DateTime.Now
});
SubmitChanges();
我最初的想法是创建一个Id列,当没有提供Id时,它能够将自己初始化为一个值,但会使用提供id时提供的id。
但是因为Guid是一个结构,而不是一个类,Id永远不会为null,所以Id被初始化为他的默认值(00000000-0000-0000-0000-000000000000
)。因此,SQL服务器认为Id始终是一个值,然后永远不会调用NEWID()默认指令。
是否可以强制调用特定值的NEWID()?我应该使用触发器来评估Id的值以及它的时间(00000000-0000-0000-0000-000000000000
)然后调用NEWID()吗?有哪些解决方案或解决方法?
答案 0 :(得分:1)
您可以使用检查约束来执行此操作:
ALTER TABLE [dbo].[SandTable]
ADD CONSTRAINT [DF_SandTable_Id] DEFAULT (NEWID()) FOR [Id]
ALTER TABLE [dbo].[SandTable]
WITH CHECK ADD CONSTRAINT [CK_SandTable_Id_Empty]
CHECK (
[Id] <> CAST(0x0 AS UNIQUEIDENTIFIER)
)