我有两个表标题和项目,具有一对多的关系。

标题表

Id      StartDate   EndDate
---------------------------------------
1       1999/1/1    1999/5/1
2       2000/1/1    2000/4/1
3       2000/1/1    2000/5/1


和项目表

Id      HeaderRef   SLRef
-------------------------------------
101     1           201
102     2           201


如何防止添加具有HeaderRef=3SLRef=201的项目,因为它具有相同的SLRef,并且HeaderRef引用它的标题行具有StartDate and EndDate另一个具有相同SLRef的项目引用了Header在那个范围内。

最佳答案

假设您正在使用MS SQL Server,则有两种方法可以实现您要寻找的内容:

1)使用其他用户建议的触发器。触发器将用于INSERT / UPDATE,它将检查日期范围,并允许添加新值或引发错误。

2)您可以在ItemTable中使用复合主键:

CREATE TABLE [dbo].[ItemTable](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [HeaderRef] [int] NOT NULL,
    [SLRef] [int] NOT NULL,
PRIMARY KEY CLUSTERED
(
    [HeaderRef] ASC,
    [SLRef] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO


现在,这将对ItemTable和SQL Server施加约束,将不允许headerRef和SLRef int值(键)的重复组合。

返回您的HeaderTable,可以放置唯一约束来停止重复开始日期和结束日期的范围

CREATE TABLE [dbo].[HeaderTable](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [STARTDATE] [datetime] not NULL,
    [ENDDATE] [datetime] not NULL,
 CONSTRAINT [PK_HeaderTable] 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]

GO


现在在HeaderTable上为开始日期和结束日期创建唯一索引。

/****** Object:  Index [IX_HeaderTable]    Script Date: 03/13/2017 12:24:51 ******/
CREATE UNIQUE NONCLUSTERED INDEX [IX_HeaderTable] ON [dbo].[HeaderTable]
(
    [ENDDATE] ASC,
    [STARTDATE] 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


您还可以在HeaderTable上放置另一个约束,以检查开始日期是否可以早于结束日期。

ALTER TABLE [dbo].[HeaderTable]  WITH CHECK ADD  CONSTRAINT [CheckEndLaterThanStart] CHECK  (([ENDDATE]>=[STARTDATE]))
GO

ALTER TABLE [dbo].[HeaderTable] CHECK CONSTRAINT [CheckEndLaterThanStart]
GO


希望这可以帮助!

10-07 19:00