如何更新分配有 MySQL/MariaDB 中最新值的日期类型的列

How to update a column of date type assigned with the latest value in MySQL/MariaDB

我正在通过 Spring Boot 的 JPA 依赖项处理我的 MariaDB。

我有一个 table 看起来像下面描述的那个

Field Type Null Key Default Extra
id varchar(32) NO PRIMARY NULL -
name varchar(256) YES - NULL -
date datetime(3) NO PRIMARY NULL -
ip varchar(40) NO PRIMARY NULL -

因此,id、date 和 ip 字段是此 table 的复合主键。

我正在尝试使用

之类的查询更新匹配结果中最新的 date
UPDATE my_table SET date = NOW() WHERE
   id = 'finding_id' AND
   ip = 'finding_ip';

由于数据中存在重复的 id-ip 对条目,如下所示,

id name date ip
finding_id finding_name 2022-03-28 17:27:39.617 finding_ip
finding_id finding_name 2022-03-28 16:52:01.483 finding_ip
another_id1 another_name1 2022-03-28 16:29:39.552 another_ip1
another_id2 another_name2 2022-03-28 16:29:24.435 another_ip2

我收到一条错误消息。

作为权宜之计,我在 where 子句中附加了另一个限制,以将时间范围缩小为“最后 15 分钟内”。

但我正在为这个问题寻找更优雅的解决方法。

这里的问题是数据库模式。

您有一个主键,它是 3 列的 UNIQUE 复合 键,并且您希望能够拥有 non-unique 设置在其中。

除非您想每次(adding/substracting 毫秒)将 Date 更新为新的日期是不可能的。

我会推荐,因为你似乎不关心 3 列的唯一性,将索引类型从 PRIMARY 更改为 INDEX(仍然是复合材料),因此您没有 UNIQUE 约束。

之后添加一个新的“真实”id 列 primary_id(或重命名您的另一列,因此新的可以是 id)列,这只是一个普通的 主键 自动递增开启。

在 MySQL 和 MariaDB 中,您可以在更新语句中使用 ORDER BY 和 LIMIT:

UPDATE my_table 
SET `date` = NOW() 
WHERE
   id = 'finding_id' AND
   ip = 'finding_ip'
ORDER BY `date` DESC
LIMIT 1;

由于WHERE-clause,以上将使用当前日期时间更新具有最高日期的记录。

注意:最好不要使用任何 RESERVED WORDS 作为列名。你可以,但是你必须在字段名周围使用反引号。