Php mysql-如果日期与现有日期不重叠,则在日期列中插入日期范围

Php mysql-如果日期与现有日期不重叠,则在日期列中插入日期范围,php,mysql,validation,date,datetime,Php,Mysql,Validation,Date,Datetime,我有以下表格结构: 表名:avail id (autoincremetn) | acc_id | start_date | end_date ------------------------------------------------------- 1 | 175 | 2015-05-26 | 2015-05-31 | ------------------------------------------------------- 2

我有以下表格结构:

表名:avail

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\U id都不可用

根据用户输入,我正在关闭不同的范围,但如果用户试图关闭提交范围,并且提交范围的开始或结束日期在DB中已提交acc_id的现有范围内,我想抛出一个错误。 在本例中,开始日期:2015-05-30结束日期:2015-06-04将是一个很好的失败候选

我发现这个QA:

这很好地解释了如何通过两个步骤、两个查询以及中间的一些PHP逻辑来完成这项工作

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

编辑:

针对Petr的评论,我将进一步说明验证:

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


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

见:

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

PostgreSQL似乎确实支持表上的检查约束,但我不确定切换数据库引擎是否可行,或者仅仅使用该功能是否值得

在MySQL中,可以使用触发器来解决这个问题,它将在插入/更新发生之前检查重叠行,并使用SIGNAL语句抛出错误。请参阅:但是,要使用此解决方案,您必须使用最新的MySQL版本


除了纯SQL解决方案,这通常是在应用程序逻辑中完成的,因此无论哪个程序访问MySQL数据库,通常都会通过请求SELECT COUNTid中新条目违反的每一行来检查此类约束。。。陈述如果返回的计数大于0,则不会插入/更新。

作为附带问题,您没有指定如果用户的范围与现有范围完全重叠,您需要做什么?在您的示例中,范围2015-05-20、2015-06-10是否失败?它重叠,但要求它的开始或结束日期在已经存在的范围内的某个地方不成立。@Petr感谢您的快速回复,任何类型的重叠都应该避免,即使是包含整个范围或发现自己在现有范围内的重叠。此外,如果开始或结束日期等于现有的开始或结束日期,则必须将其视为重叠。有时某些acc_id在表中已经有多个范围,因此应针对具有给定acc_id的所有条目进行验证。然后,您最好编辑您的问题以使其清楚。当你收到任何答案时,我不会回答,因为我对mysql不太了解,记住也要对照这个案例检查它们,因为很容易忽略这个案例。非常感谢。当我阅读你发布的所有链接时,我会让它打开,然后接受答案。应用逻辑就是这样!不可能的那是打斗的谈话-