应拆分为两个条件:HOUR(NOW()) >= 22 OR HOUR(NOW())
触发器里怎么判断“当前是否在禁止删除时段”
不能靠
BETWEEN '22:00' AND '06:00'这种写法——跨天范围在 MySQL 里会永远为 false。正确逻辑是拆成两个独立条件:HOUR(NOW()) >= 22或HOUR(NOW()) ,再用 <code>OR连接。更稳妥的做法是把时间判断下沉到秒级:
NOW() >= TIMESTAMP(CONCAT(CURDATE(), ' 22:00:00')) OR NOW() ,避免跨天时 <code>CURDATE()变更导致边界错位。常见错误现象:
DELETE FROM orders WHERE id = 123在 23:59 执行成功,但 00:01 又被允许——其实是没覆盖“次日 00:00–06:00”这个区间,只查了当天的 22:00 后。BEFORE DELETE 触发器中抛错必须用 SIGNAL
MySQL 5.7+ 支持
SIGNAL SQLSTATE '45000'主动中断操作;低版本只能用INSERT INTO nonexistent_table强制报错,不推荐。注意点:
SIGNAL必须配合DECLARE CONTINUE HANDLER FOR SQLEXCEPTION才能生效,否则只是抛错不中断(尤其在存储过程嵌套调用时)- 错误信息要带业务语义,比如
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Deletion prohibited between 22:00 and 06:00',方便应用层识别- 不要在触发器里写
ROLLBACK—— 触发器本身不能控制事务,SIGNAL就够了为什么不能在触发器里查当前表做权限校验
比如想检查用户是否有“夜间删除”白名单,写成
SELECT 1 FROM delete_whitelist WHERE user_id = OLD.user_id,这在BEFORE DELETE里会直接报错:ERROR 1442 (HY000): Can't update table 'orders' in stored function/trigger...。
MySQL8 CRM Schema Design Expert下载面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
根本原因是:MySQL 禁止在触发器中对“正在被 DML 操作的同一张表”执行 SELECT(即使是只读),除非该查询走的是主键或唯一索引且明确加了
FOR UPDATE(但这里不适用)。可行替代方案:
- 把白名单数据缓存在内存表(
CREATE TEMPORARY TABLE)或配置表(独立小表 + 复合索引)- 改用应用层鉴权,触发器只做时间兜底
- 用 MySQL 8.0+ 的角色权限机制,在连接层控制
DELETE权限(需配合SET ROLE动态切换)跨时区部署时 CURRENT_TIMESTAMP 和 NOW() 的区别
如果数据库服务器时区设为
+00:00,但业务面向中国用户(+08:00),直接用NOW()判断 22:00–06:00 就会全错。正确做法是统一换算到业务时区:
- 先确认 session 时区:
SELECT @@session.time_zone- 显式转时区:
CONVERT_TZ(NOW(), '+00:00', '+08:00'),再取HOUR()- 或者更简单:让应用层传入带时区的时间戳字段(如
delete_at),触发器直接查OLD.delete_at值,避免依赖服务端时钟真正容易被忽略的是:事件调度器(EVENT)、触发器、客户端连接三者的时区可能不一致,单靠
NOW()做判断,在灰度发布或分库场景下极易漏控。
相关文章
Hyperf怎么设置MySQL连接保活?
Hyperf3.2 swoole.enable_coroutine怎么开启
Hyperf配置MySQL协程是什么意思
Hyperf协程MySQL怎么调试SQL?
Hyperf3.1数据库连接池pool参数怎么配
本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门AI工具
相关专题
数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。
4743
2023.10.12
SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。
971
2023.10.27
在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。
1249
2024.02.23
SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。
6741
2024.03.06
sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。
3463
2024.03.06
运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。
6740
2024.04.07
sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。
1270
2024.04.29
本专题聚焦Docker Desktop容器端口映射与访问配置,整理从创建容器、设置端口绑定到验证本地服务访问的操作流程。针对端口被占用、映射配置错误、容器服务无法访问等情况,也提供相应的检查方向,方便用户完成端口配置。
0
2026.11.03
热门下载
相关下载
精品课程
最新文章











