如何更新分配有 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 作为列名。你可以,但是你必须在字段名周围使用反引号。
我正在通过 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 作为列名。你可以,但是你必须在字段名周围使用反引号。