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

2024-06-26

我有以下表结构:

表名:available

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 之间的所有日期均不可用。

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

我发现了这个质量检查:MySQL 重叠日期,无冲突 https://stackoverflow.com/questions/6519424/mysql-overlapping-dates-none-conflicting

这几乎解释了如何通过 2 个步骤、2 个查询以及中间的一些 PHP 逻辑来完成此操作。

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

EDIT:

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

应避免任何形式的重叠,即使是包含 整个范围或发现自己位于现有范围内。另外,如果 开始或结束日期必须等于现有的开始或结束日期 被认为是重叠。有时某些 acc_id 已经有更多 比表中的一个响亮,所以验证应该针对 具有给定 acc_id 的所有条目。


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

See: https://dev.mysql.com/doc/refman/5.7/en/create-table.html 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 https://dev.mysql.com/doc/refman/5.7/en/signal.html)但是,要使用此解决方案,您必须使用最新的 MySQL 版本。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql - 如果日期不与现有日期重叠,则将日期范围插入日期列 的相关文章

  • php-fpm 需要在监狱环境中放置哪些系统文件才能在 ubuntu 上正常运行?

    我在 ubuntu 12 04 上使用 php5 fpm 并且为 nginx 托管的每个域都有单独的池和 chroot 位置 不过 我知道有些系统文件需要直接放在jail中 但是我需要哪些呢 我知道 dns 解析当前不起作用 并且我读过一些
  • 检查 Laravel 模型是否已保存或查询是否已执行

    我见过很多人使用这种方式来检查 Laravel 模型是否已保存 所以现在我想知道这是否是一种安全的方法 我还可以检查下面的查询是否像这样执行 检查模型是否已保存 Eg myModel new User myModel gt firstnam
  • 在 PHP 中获取和设置(私有)属性,就像在 C# 中一样,无需使用 getter setter 魔术方法重载

    Summary 代码示例 Class People private property private name other methods not shown for simplicity 直线前进 让我假设 name is a PRIVA
  • 如何将parameters.yml中的Symfony参数注入Behat 3配置中?

    我需要设置base url for Behat MinkExtension 这是我的一部分应用程序 配置 parameters yml parameters behat base url http my app local app test
  • 如何将逗号分隔值传递给 MySql 中的存储过程?

    我有像这样的存储过程 CREATE DEFINER test PROCEDURE test get details in p istudid int in p icourseid int in p branchid varchar 20 B
  • 致命错误:在非对象上调用成员函数 FetchRow()

    这是我的错误消息致命错误 Call to a member function FetchRow on a non object in C AppServ www hfix include care api classes class min
  • 使用 C++ 连接器的 C++ mysql 连接 bad_alloc

    尝试建立一个简单的 mysql 连接 但得到一个bad alloc即使查看类似的帖子 我也不知道如何解决这个问题 这是我的代码 include
  • PHP 中的延迟加载类方法

    我有一堂课 里面有一些相当大的方法 在它的基本和最常见的状态下 大多数功能并不是必需的 所以我想知道是否有一种方法可以延迟加载类的一部分 这些方法需要能够访问私有 受保护的成员 因此如果这些方法是类的本机方法 那将是理想的选择 但是在寻找其
  • 更改二维数组每一行中的键而不丢失值

    我有一个行数组 其中一个 视觉 数据列有两个相似但不同的键 我想替换其中一个键 以便该列在所有行中具有相同的键 我的输入数组 Ttitle gt lilly Price gt 1 75 Number gt 3 Title gt rose P
  • 在 foreach 循环中使用 next

    我正在使用 foreach 循环数组 在特定情况下 我需要在迭代到达下一个元素 如预测 之前知道下一个元素的值 为此 我计划使用该功能next http www php net manual en function next php 在文档
  • 从套接字读取数据,发送响应并关闭

    我正在开发一个 c 和 php 项目 其中 PHP 脚本打开一个到 c 程序的套接字 c 程序将读取数据 然后发回响应 在 PHP 脚本中我有以下内容 echo Opening Client fp fsockopen 127 0 0 1 1
  • PHP:注意:定义会话变量的索引未定义

    我正在制作一个带有电子邮件验证器的注册系统 您典型的 使用此代码来验证 类型的事情 我希望存储一个会话变量 以便当人们在注册页面上完成帐户注册并意外导航回该页面时 它会提醒他们需要在使用前激活帐户 使这个问题如此难以诊断的原因是我以类似的方
  • 即使为空也显示值

    我正在使用以下内容显示过去 7 天内添加的产品计数 即使 COUNT 0 我是否可以以某种方式定制查询以显示过去 7 天的所有产品 查询现状 SELECT DAYNAME dateadded DAY COUNT COUNT FROM pro
  • 将查询错误转变为 MySQLi 中的异常[重复]

    这个问题在这里已经有答案了 我试图将 MySQLi 查询错误转为异常 但无法 mysqli sql 异常 http php net manual en class mysqli sql exception php仅当连接数据库失败时才会抛出
  • PHP、MySQL 验证故障且搜索不起作用?

    我创建了一个小的注册粘性表格 一切工作正常 但如果我输入任何错误的值 例如姓名中的数字 年龄中的字母甚至错误的电子邮件格式 那么数据仍然保存在数据库中 我无法找出验证问题 另外一个是搜索选项 每当我在搜索框中输入任何名字或姓氏时 它都应该显
  • 从设备获取日期并将其转换为 GMT+4

    我正在尝试查找 Android 手机的时区 因为我想获取日期对象 但我想要 GMT 4 格式 我看到的所有其他答案都会转换来自 API 请求的时间 其时区已知 我怎样才能做到这一点 其他方法可能是将服务器传来的 GMT 4 时间转换为我设备
  • Oracle TO_DATE 函数中跳过字符

    我正在导入 tsv 中具有 SQL Server 格式日期的数据 yyyy mm dd hh24 mi ss mmm 使用 SQL Developer 的导入数据向导导入 Oracle 数据库 我怎样才能忽略 mmm用于将它们导入 DATE
  • 为什么在这个数组中 NULL 递减而不是负数?

    我已经尝试过这段代码 a array fill 0 4 NULL a 0 a 1 a 2 a 3 var dump a Result array 4 0 gt int 1 1 gt int 1 2 gt NULL 3 gt NULL 为什么
  • PHP:系统时区设置错误

    我尝试在 MAMP 下的终端中使用 PHP 但出现与系统时区设置相关的错误 我该如何修复这个错误 应用程序 MAMP bin php5 bin php 回声 php PHP 严格标准 PHP 启动 它 依赖系统是不安全的 时区设置 请使用
  • PHP SFTP 简单文件上传

    我正在使用 phpseclib SFTP 类 并尝试上传这样的文件 sftp new Net SFTP mydomain com if sftp gt login user password exit Login Failed sftp g

随机推荐