【问题标题】:Update timestamp only when a non-NULL value is entered in another field仅当在另一个字段中输入非 NULL 值时才更新时间戳
【发布时间】:2015-05-09 02:33:24
【问题描述】:

假设有一个包含以下字段的表格:

ID (auto-increment, int, primary)
NAME (varchar 60)
LOC_LAT (float 8,6)
LOC_LONG (float 9,6)
LASTSEEN (timestamp)

我真的很喜欢 timestamp 数据类型,因为它通过将所有内容存储为 UTC 来减轻时区重新计算的负担。但是,每次在表中的任何位置更改任何内容时,它都会更新。我需要的是 LASTSEEN 字段仅在 LOC_LATLOC_LONG 字段更新为非 NULL 时更新为新的时间戳价值。可能吗?还是我必须求助于日期时间?

这是我尝试过的,但它根本没有做任何事情:

DROP TRIGGER IF EXISTS `trigger_last_seen`;
CREATE DEFINER=`root`@`localhost` TRIGGER `trigger_last_seen`
BEFORE UPDATE ON `distilled` FOR EACH ROW IF (NEW.LOC_LAT != NULL OR NEW.LOC_LONG != NULL)
THEN SET NEW.LASTSEEN = current_timestamp();
END IF

上面的触发器什么都不做——甚至没有错误!

【问题讨论】:

    标签: mysql triggers timestamp


    【解决方案1】:

    使用IS NOT NULL 而不是!=

    【讨论】:

    • Tried IS NOT NULL 但它会抛出此错误:MySQL said: #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'NULL OR NEW.LONGITUDE IS NOT NULL NULL) THEN UPDATE distilled_contacts` SET NE' at line 1`
    • 你有两次 null 有问题。此外,您可能需要在每个 is not null 语句周围添加括号,但我认为情况并非如此
    • 这是我尝试过的: IF ((NEW.LATITUDE IS NOT NULL NULL) OR (NEW.LONGITUDE IS NOT NULL NULL)) THEN UPDATE distilled_contacts SET NEW.LASTSEEN = now();结束如果
    • 对,每一个都有两次null,那是语法错误,你不做is not null null,只做is not null
    • 糟糕!真可惜。更正了它,触发器不再抛出错误。但是,当我尝试更新相关表中的记录时,这就是它给出的结果:#1442 - 无法更新存储函数/触发器中的表“distilled_contacts”,因为它已被调用此存储函数的语句使用/触发。
    猜你喜欢
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    • 2022-12-15
    • 1970-01-01
    • 2015-08-01
    • 2019-03-31
    • 1970-01-01
    相关资源
    最近更新 更多