如何仅在将exist设为'1'时更新MySQL的TIMESTAMP字段?
解决方案:仅在更新
exist为'1'时同步更新tm字段 下面提供两种可行的实现方式,解决你需要仅当exist字段被设为'1'时才更新tm时间戳的需求:
方案一:直接在UPDATE语句中处理(最简单)
不需要额外触发器,直接在更新exist='1'的同时指定tm为当前时间。推荐用MySQL内置的NOW()函数获取时间,避免PHP和MySQL时区不一致的问题,同时必须修复SQL注入漏洞:
if (isset($_GET["id"])) { $id = $_GET["id"]; // 使用预处理语句防止SQL注入 $sql = "UPDATE admins SET exist='1', tm=NOW() WHERE id=?"; $stmt = $con->prepare($sql); $stmt->bind_param("i", $id); // id是整数类型,用i绑定参数 $stmt->execute(); } header("location: /index.php"); exit;
如果要避免重复更新(比如exist已经是'1'时不修改tm),可以给WHERE条件加判断:
UPDATE admins SET exist='1', tm=NOW() WHERE id=? AND exist!='1'
方案二:使用BEFORE UPDATE触发器(自动触发场景)
你之前的触发器有两个错误:字段名写错(是exist不是exists)、逻辑没限定“从非1改为1”。修正后的触发器会在每次更新前检查,只有当exist被从非1的值改为1时,才更新tm:
DELIMITER $$ CREATE TRIGGER update_tm_on_exist_set_to_1 BEFORE UPDATE ON admins FOR EACH ROW BEGIN -- 仅当exist状态从非1变为1时更新时间戳 IF OLD.exist != '1' AND NEW.exist = '1' THEN SET NEW.tm = NOW(); END IF; END$$ DELIMITER ;
设置这个触发器后,不管用什么方式更新exist为'1',都会自动同步更新tm,其他字段的修改不会影响tm。
额外修正建议
- 表结构小问题:你提供的建表语句有语法错误,修正后如下:
CREATE TABLE admins ( id int NOT NULL AUTO_INCREMENT, bez varchar(55) DEFAULT 'unknown', type varchar(7) NOT NULL DEFAULT 'unknown', exist char NOT NULL DEFAULT '0', tm TIMESTAMP DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id) );
- SQL注入风险:原代码直接拼接
$_GET["id"]到SQL中,存在严重安全隐患,一定要用预处理语句(如方案一所示)。
内容的提问来源于stack exchange,提问作者wemfal
相关产品推荐
相关产品推荐

