【发布时间】:2018-07-26 19:37:18
【问题描述】:
我想创建具有以下约束的表,是否可以使用 SQL Server Management Studio?
- 身份证
- ProductId [可空列]
- CompanyId [可空列]
- 用户名 [对于每个 productId 都是唯一的 - 如果 DeletedAt 不为 NULL]
- 标识符 [Nullable 列] [每个 companyId 都是唯一的 - 如果 DeletedAt 不为 NULL]
- DeletedAt [可空列]
更新: 我的表创建查询如下:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[User](
[Id] [int] IDENTITY(1,1) NOT NULL,
[ProductId] [int] NULL,
[CompanyId] [int] NULL,
[Username] [nvarchar](max) NOT NULL,
[Identifier] [nvarchar](max) NULL,
[DeletedAt] [datetime2](7) NULL,
CONSTRAINT [PK_User] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
【问题讨论】:
-
我猜你会INSTEAD OF触发强制业务规则约束。
-
所以你可以有 2 个 JohnSmith 用户名作为 productID 1,只要两者都有 DeletedAt 值?
-
@dfundako 是的。
-
您可以创建这些约束,但在约束中使用如此复杂的逻辑,您会受到性能影响,我建议使用存储过程(用于更新、插入和删除)来处理业务逻辑和不要使用这种复杂的约束。
-
“DeletedAt”是日期时间吗?当我阅读需求时,我的第一个想法是“这是一个缓慢变化的维度,他使用 'DeletedAt' 作为逻辑删除标志。”如果我是对的,您可以将 DeletedAt 添加到唯一约束。或者,您可以制作一个存档表,每当您从主表中删除一条记录时,您都会在存档表中制作一份副本。
标签: sql sql-server