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中. 我发现了这个QA: 这几乎解释了如何分两步完成,两个查询之间有一些PHP逻辑. 但我想知道是否可以在一个插入语句中完成. 编辑: 为了回应Petr的评论,我将进一步说明验证:
解决方法
可悲的是,使用MySQL这是不可能的.或者至少,实际上.首选方法是使用SQL CHECK约束,这些约束是SQL语言标准.但是,MySQL不支持它们.
见:https://dev.mysql.com/doc/refman/5.7/en/create-table.html
似乎PostgreSQL确实支持表上的CHECK约束,但我不确定切换数据库引擎的可行性是多么可行,或者如果使用该功能甚至是值得的. 在MySQL中,可以使用触发器来解决此问题,该问题将在插入/更新发生之前检查重叠行,并使用SIGNAL语句抛出错误. (参见:https://dev.mysql.com/doc/refman/5.7/en/signal.html)但是,要使用此解决方案,您必须使用最新的MySQL版本. 除了纯SQL解决方案之外,这通常是在应用程序逻辑中完成的,因此访问MySQL数据库的任何程序通常都会通过请求SELECT COUNT(id)中新条目违反的每一行来检查这些约束.声明.如果返回的计数大于0,则根本不插入/更新. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |