Php mysql-如果日期与现有日期不重叠,则在日期列中插入日期范围
我有以下表格结构: 表名:availPhp 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
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不太了解,记住也要对照这个案例检查它们,因为很容易忽略这个案例。非常感谢。当我阅读你发布的所有链接时,我会让它打开,然后接受答案。应用逻辑就是这样!不可能的那是打斗的谈话-