You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅在将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。

额外修正建议

  1. 表结构小问题:你提供的建表语句有语法错误,修正后如下:
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)
);
  1. SQL注入风险:原代码直接拼接$_GET["id"]到SQL中,存在严重安全隐患,一定要用预处理语句(如方案一所示)。

内容的提问来源于stack exchange,提问作者wemfal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 21:24:27