分区序列/身份

时间:2017-04-18 02:57:10

标签: sql-server sql-server-2012

给出这样一个表

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[_bh_test](
    [Id] [bigint] IDENTITY(1,1) NOT NULL,
    [Agency] [int] NOT NULL,
    [Year] [int] NULL,
    [Num] [int] NOT NULL
) ON [PRIMARY]

GO
SET IDENTITY_INSERT [dbo].[_bh_test] ON 

GO
INSERT [dbo].[_bh_test] ([Id], [Agency], [Year], [Num]) VALUES (1, 1, 2015, 1)
GO
INSERT [dbo].[_bh_test] ([Id], [Agency], [Year], [Num]) VALUES (2, 1, 2015, 2)
GO
INSERT [dbo].[_bh_test] ([Id], [Agency], [Year], [Num]) VALUES (3, 1, 2016, 1)
GO
INSERT [dbo].[_bh_test] ([Id], [Agency], [Year], [Num]) VALUES (4, 2, 2015, 1)
GO
INSERT [dbo].[_bh_test] ([Id], [Agency], [Year], [Num]) VALUES (5, 2, 2015, 2)
GO
INSERT [dbo].[_bh_test] ([Id], [Agency], [Year], [Num]) VALUES (6, 2, 2016, 1)
GO
INSERT [dbo].[_bh_test] ([Id], [Agency], [Year], [Num]) VALUES (7, 2, 2016, 2)
GO
INSERT [dbo].[_bh_test] ([Id], [Agency], [Year], [Num]) VALUES (8, 3, 2015, 1)
GO
INSERT [dbo].[_bh_test] ([Id], [Agency], [Year], [Num]) VALUES (9, 3, 2015, 2)
GO
INSERT [dbo].[_bh_test] ([Id], [Agency], [Year], [Num]) VALUES (10, 3, 2016, 2)
GO
SET IDENTITY_INSERT [dbo].[_bh_test] OFF
GO
/****** Object:  Index [UIX_Agency_Year_Num]    Script Date: 4/17/2017 10:42:15 PM ******/
CREATE UNIQUE NONCLUSTERED INDEX [UIX_Agency_Year_Num] ON [dbo].[_bh_test]
(
    [Agency] ASC,
    [Year] ASC,
    [Num] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO

我希望Num列在插入时始终具有在特定Agency内唯一的值。另外,我希望它是一个以前从未使用过的数字。

例如,如果我在代理商3中插入一个值,那么Num的一个好候选人将是3。

似乎我可以使用默认/绑定到一个函数,该函数将MAX(Num)+ 1与一个group by for Agency。但是,我无法向该机构发送该功能。但是,如果MAX(Num)是2并且我插入3 ...然后删除3,然后再插入它将重复使用3的Num,这是错误的,因为我只想要它使用从未使用过的Num之前。

听起来对我来说理想的解决方案是跟踪计数器的序列。虽然我似乎无法在SEQUENCE中使用OVER中的PARTITION BY。此外,可以手动设置Num,因此如果序列为+1,则使用默认seq插入两个值。所以现在计数器是2 ...可能是3手动插入,然后默认情况下下一次插入将是3.我必须确保更新INSERT上的序列

我不确定最好的方法。我认为使用INSERT TRIGGER是一个选项,但如果删除MAX()并完成INSERT,我不知道如何解决整个问题。

0 个答案:

没有答案