结合2列的棘手约束

时间:2017-08-16 12:13:04

标签: sql-server database constraints combinations

我需要确保MSSQL数据库中数据的完整性。我的数据模型包含两个重要字段,它们是另一个表的外键。例如TripId和ReservationId(随机名称,所以不要为此烦恼)。

我需要能够在以下情况下插入数据: - ReservationId和TripId不为空 - ReservationId为null,TripId不为空 -ReservationId不为null且TripId为空

这很棘手,因为我需要在其中一个Id用于antoher组合时拒绝插入,例如: 我的数据库包含RES111和TRIP666的记录。我必须能够插入具有相同ID的另一条记录进行预订和旅行。 我不能插入只包含一个ReservationId或TripId或其他组合的数据(例如拒绝:RES111和TRIP777必须被拒绝)

提供一个Id时也是如此,例如ReservationId。 必须拒绝包含任何tripId的使用过的ReservationId的插入内容。

我可以在应用程序代码中提供这样的过滤,但必须在数据库级别上完成

2 个答案:

答案 0 :(得分:0)

您可以编写条件插入
例如

insert into tblname (value, name) 
select 'foo', 'bar'
where not exists (select 1 from table where null IN (ReservationId, TripId));

当然,您需要根据自己的需要进行定制。

基本概念是,只要子查询返回结果,就会发生插入,因此子查询可能是一个非常复杂的约束或检查。

答案 1 :(得分:-1)

您可以使用Trigger或使用CHECK CONSTRAINT来调用封装您要强制执行的逻辑的UDF。