【问题标题】:How to just update the timestamp in duplicate rows while storing the original time stamp?如何在存储原始时间戳的同时仅更新重复行中的时间戳?
【发布时间】:2020-09-20 00:57:40
【问题描述】:

我有一个 python 脚本,它可以抓取网站并将值插入 MySQL 数据库。该脚本在睡眠延迟循环中不断抓取不断更新的网站。现在有 5 列值(例如,狗、猫、鼠标、蜥蜴、蛇)是从网站上抓取的,第 6 列是通过 python 脚本将行插入数据库时​​添加的时间戳。我不想插入重复的行,但如果有重复,我想保留原始时间戳以及更新的时间戳。数据库用户的一个重要指标是第一次找到该行的时间以及它是否在被抓取的网站上仍然可用。

例如:假设在下午 2:30 插入脚本(beagle、calico、white mouse、gecko、python)。当循环在半小时内再次运行时,它会找到同一行,但新的时间戳为下午 3:00。不插入重复记录但说明第一次找到该行与最后一次找到该行之间的 30 分钟时间差的最佳方法是什么?我在 Python 方面相当不错,但对 MySQL 的经验很少,所以也许我需要一点帮助。你认为我应该通过 SQL 查询将这个功能放在脚本端还是数据库端?如果是这样怎么做?

谢谢!

【问题讨论】:

  • 使列唯一,然后在 ERROR UPDATE 上使用 INSERT 添加最新时间
  • 如果您的第一个时间戳字段date_insert,您可以添加另一个字段date_update

标签: python mysql date sql-update sql-insert


【解决方案1】:

我建议:

  • 有两个不同的时间戳列:一个存储记录创建的日期,另一个存储最后修改的日期。这可以在 MySQL 中使用默认值轻松完成,因此您无需从应用程序代码中管理这些列
  • 在所有其他列上创建唯一(或主键)约束,以便在处理新数据时可以使用 ON DUPLICATE KEY 语法

设置:

create table mytable (
    dog varchar(50),
    cat varchar(50),
    mouse varchar(50),
    lizard varchar(50),
    snake varchar(50),
    created_at timestamp 
        default current_timestamp,
    modified_at timestamp 
        default current_timestamp 
        on update current_timestamp,
    primary key (dog, cat, mouse, lizard, snake)
);

insert/update 语句示例:

insert into mytable 
    (dog, cat, mouse, lizard, snake)
values(?, ?, ?, ?, ?)
on duplicate key update modified_at = current_timestamp

【讨论】:

  • @WestonBushyeager:您错过了查询的结尾(... update dog = values(dog)
猜你喜欢
  • 2016-08-10
  • 2023-04-09
  • 2010-11-05
  • 2019-08-08
  • 2013-12-09
  • 2019-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多