如果日期与现有日期不重叠,则将日期范围插入日期列



我有以下表格结构:

表名:可用

id (autoincremetn) | acc_id | start_date | end_date
-------------------------------------------------------
1                  | 175    | 2015-05-26 | 2015-05-31 |
-------------------------------------------------------
2                  | 175    | 2015-07-01 | 2015-07-07 |
-------------------------------------------------------

它用于定义日期范围的可用性,例如,对于给定的acc_id,start_date和end_date之间的所有日期都不可用。

根据用户输入,我正在关闭不同的范围,但如果用户试图关闭(提交(一个范围,该范围的起始或结束日期在DB中已经存在的范围内(对于提交的acc_id(,我想抛出一个错误。在本例中,start_date:2015-05-30 end_date:201506-04将是一个很好的失败候选者。

我发现了这个QA:MySQL日期重叠,无冲突

这基本上解释了如何在两个步骤中完成,两个查询之间有一些PHP逻辑。

但我想知道是否可以在一个插入语句中完成。我最终会检查受影响的行是否成功(子问题:除了日期重叠之外,是否有更方便的方法来检查它是否因其他原因失败?(

编辑

作为对Petr评论的回应,我将进一步说明验证:

应该避免任何形式的重叠,即使是包含整个范围或发现自己在现有范围内。此外,如果开始日期或结束日期等于它必须为的现有开始日期或终止日期被认为是重叠。有时某些acc_id已经有更多表中有多个响铃,因此应根据具有给定acc_id的所有条目。

遗憾的是,只使用MySQL是不可能的。或者至少,实际上。首选的方法是使用SQL CHECK约束,这些约束在SQL语言标准中。但是,MySQL不支持它们。

请参阅:https://dev.mysql.com/doc/refman/5.7/en/create-table.html

CHECK子句已解析,但被所有存储引擎忽略。

PostgreSQL似乎确实支持表上的CHECK约束,但我不确定切换数据库引擎的可行性,也不确定仅仅使用该功能是否值得麻烦。

在MySQL中,可以使用触发器来解决这个问题,该触发器将在插入/更新发生之前检查重叠的行,并使用SIGNAL语句抛出错误。(请参见:https://dev.mysql.com/doc/refman/5.7/en/signal.html)然而,要使用此解决方案,您必须使用最新的MySQL版本。

除了纯SQL解决方案外,这通常是在应用程序逻辑中完成的,因此无论哪个程序访问MySQL数据库,通常都会通过请求SELECT COUNT(id) ...语句中新条目违反的每一行来检查这些约束。如果返回的计数大于0,那么它就不会插入/更新。

相关内容

  • 没有找到相关文章