【发布时间】:2020-02-09 09:22:06
【问题描述】:
我有一个 SQL Server 2016 表,其中在任何给定时间都应该只有一条记录处于活动状态。将对它进行 CRUD 操作。
我正在尝试在该表上创建一个唯一的非聚集索引,以便它在任何时候都只有 1 条活动记录。活动记录的标准是今天的日期是否在StartDate 和StopDate 之间。 ID 是唯一键。其余的,我不确定我的语法和策略是否正确。
这是我的 SQL:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[GWFO_FlashNewsItem]
(
[ID] [INT] IDENTITY(1,1) NOT NULL,
[Title] [VARCHAR](150) NOT NULL,
[NavigateToURL] [VARCHAR](250) NULL,
[StartDate] [SMALLDATETIME] NOT NULL,
[StopDate] [SMALLDATETIME] NULL,
[Active] [BIT] NOT Null,
[UpdateSOEID] [CHAR](7) NULL,
[UpdateDate] [SMALLDATETIME] NULL,
CONSTRAINT [PK_GWFO_FlashNewsItem]
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]
CREATE UNIQUE NONCLUSTERED INDEX uixf_GWFO_FlashNews_Active_filtered
ON GWFO_FlashNewsItem (Active)
INCLUDE (ID, Title)
WHERE Active = 1
【问题讨论】:
-
我非常有信心您不能根据当前日期创建过滤索引。 (我无法检查,但这没有任何意义,因为索引中的行会永远改变)。
-
@Larnu,这是正确的,仅限确定性子句。
-
您可以提出其他解决方案吗?例如,添加另一个位列“活动”并在插入/更新操作期间相应地设置它。并对其应用索引?
-
为什么要将 smalldatetime 转换为字符串进行比较?除了这不起作用,因为你正在尝试这是浪费精力。只需比较 smalldatetime 值。对于手头的任务,为什么需要过滤索引?只需使用排序逻辑创建一个顶部 1 的视图。
-
触发器将允许您在每次更新表时检查所需的任何条件。
标签: sql-server non-clustered-index