我有两个表Header和Item,它有一对多关系。
标题表
blackfire.agent_socket
和项目表
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=3
添加项目,因为它具有相同的SLRef=201
,而SLRef
引用它的标题行包含HeaderRef
另一个具有相同StartDate and EndDate
的项目在该范围内提到SLRef
。
答案 0 :(得分:2)
假设您正在使用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
希望这有帮助!
答案 1 :(得分:1)
您正在寻找DML触发器,简单来说,它是某种sql函数或过程,当用户尝试通过添加或删除来更改数据库内的数据时会自动调用它。此外,触发器的主体可以包含一些验证逻辑,因此除非满足某个条件,否则不会插入数据