微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – mysql – 将日期范围插入日期列中IF日期与现有日期不重叠

我有以下表结构:

表名:有用

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

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

基于用户输入我正在关闭不同的范围,但我想抛出一个错误,如果用户试图关闭(提交)一个已开始的范围或在已存在的范围内某处的end_date(对于提交的acc_id)在DB中.
在这个例子中,start_date:2015-05-30 end_date:2015-06-04将是一个很好的失败候选人.

我发现了这个QA:
MySQL overlapping dates,none conflicting

这几乎解释了如何分两步完成,两个查询之间有一些PHP逻辑.

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

编辑:

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

any kind of overlapping should be avoided,even the one embracing the
whole range or finding itself inside the existing range. Also,if
start or end dates equal the existing start or end dates it must be
considered an overlap. Sometimes certain acc_id will already have more
than one rang in the table so the validation should be done against
all entries with a given acc_id.

解决方法

可悲的是,使用MysqL这是不可能的.或者至少,实际上.首选方法是使用sql CHECK约束,这些约束是sql语言标准.但是,MysqL不支持它们.

见:https://dev.mysql.com/doc/refman/5.7/en/create-table.html

The CHECK clause is parsed but ignored by all storage engines.

似乎Postgresql确实支持表上的CHECK约束,但我不确定切换数据库引擎的可行性是多么可行,或者如果使用该功能甚至是值得的.

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

除了纯sql解决方案之外,这通常是在应用程序逻辑中完成的,因此访问MysqL数据库的任何程序通常都会通过请求SELECT COUNT(id)中新条目违反的每一行来检查这些约束.声明.如果返回的计数大于0,则根本不插入/更新.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐