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();
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();