MariaDB - 如果记录存在则插入记录或更新时间戳

MariaDB - insert record or update timestamp if record exists

Objective: cronjob 运行一个任务;成功完成后,插入新的主机记录。如果记录存在,更新时间戳以反映此状态。

# Table layout
> describe hosts_completed;
+-----------+---------------------+------+-----+-------------------+-----------------------------+
| Field     | Type                | Null | Key | Default           | Extra                       |
+-----------+---------------------+------+-----+-------------------+-----------------------------+
| id        | bigint(20) unsigned | NO   | PRI | NULL              | auto_increment              |
| timestamp | timestamp           | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| hostname  | varchar(32)         | YES  | MUL | NULL              |                             |
+-----------+---------------------+------+-----+-------------------+-----------------------------+
# Current inventory
> select * from hosts_completed;
+----+---------------------+----------+
| id | timestamp           | hostname |
+----+---------------------+----------+
| 10 | 2020-11-02 12:51:08 | myHost1  |
| 11 | 2020-11-02 14:32:16 | MyHost2  |
+----+---------------------+----------+

我想更新 myHost1 的状态,我最好的照片是

> insert into hosts_completed(hostname) values("myHost1") ON DUPLICATE KEY UPDATE timestamp=now();

它运行但添加了一条新记录,它不会更新 myHost1 记录。

哪里出了问题?

on duplicate key 语法要求对用于检测冲突的列进行唯一约束。先创建它:

alter table hosts_completed 
    add constraint unique_hostname
    unique (hostname);

请注意,此 pre-requires 列中没有重复项(否则您需要在创建约束之前整理数据)。

然后您可以使用您当前的查询:

insert into hosts_completed(hostname) 
values('myHost1') 
on duplicate key update timestamp = now();