【问题标题】:mysql - INSERT date range into date columns IF dates don't overlap with existing onesmysql - 如果日期不与现有日期重叠,则将日期范围插入日期列
【发布时间】:2015-08-06 17:28:07
【问题描述】:

我的表结构如下:

表名: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_id,start_date 和 end_date 之间的所有日期都不可用。

根据用户输入,我正在关闭不同的范围,但如果用户尝试关闭(提交)一个范围,该范围的 start 或 end_date 在已经存在的范围内(对于提交 acc_id) 在数据库中。 在此示例中,start_date: 2015-05-30 end_date: 2015-06-04 将是一个很好的失败候选。

我找到了这个 QA: MySQL overlapping dates, none conflicting

这几乎解释了如何分 2 步完成,2 个查询,中间有一些 PHP 逻辑。

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

编辑

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

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

【问题讨论】:

  • 作为一个附带问题,如果用户的范围与现有范围之一完全重叠,您没有指定您需要做什么?在您的示例中,范围 (2015-05-20, 2015-06-10) 是否应该失败?它重叠,但“它的开始或结束日期在已经存在的范围内的某个地方”的要求不成立。
  • @Petr 感谢您的快速回复,应避免任何形式的重叠,即使是包含整个范围或发现自己在现有范围内的重叠。此外,如果开始或结束日期等于现有的开始或结束日期,则必须将其视为重叠。有时某些 acc_id 在表中已经有多个响铃,因此应针对具有给定 acc_id 的所有条目进行验证。
  • 那么您最好编辑您的问题以使其清楚。而且当你收到任何答案时(我不会回答,因为我对mysql不太了解),记得也要对照这个案例检查他们,因为很容易忽略这个案例。

标签: php mysql validation date datetime


【解决方案1】:

遗憾的是,仅使用 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,则根本不会插入/更新。

【讨论】:

  • 非常感谢。在阅读您发布的所有链接并在之后接受答案时,我会保持打开状态。然后是应用程序逻辑!
  • 不可能?那是战斗的谈话;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
  • 1970-01-01
  • 2015-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多