【问题标题】:mysql merge the same data and keep the updated one latermysql合并相同的数据并保持更新后的数据
【发布时间】:2022-01-20 23:25:41
【问题描述】:

表结构

CREATE TABLE `goods` (
  `id` int NOT NULL ,
  `name` varchar(25) ,
  `updateat` datetime 
)

现在表格中有这样一条数据

当我想插入一条新的数据如(1,'new','2021-12-18 12:00:00')。首先判断表中是否有与要插入的数据相同的数据(更新时间除外),然后比较更新时间,保持最新的数据。

我想知道怎么用sql来实现这个功能。

【问题讨论】:

  • 你用的是什么关系型数据库?
  • 我用mysql.....
  • 你能解释一下相同的数据吗?你的意思是只为即将到来的idname 对更改updateat 的值吗?(例如删除现有的并插入新的)
  • 是的,我就是这个意思

标签: mysql sql


【解决方案1】:

首先将主键添加到您的表中:

CREATE TABLE goods (
  id int NOT NULL ,
  name varchar(25) ,
  updateat datetime,
  PRIMARY KEY (id, name)
)

然后使用ON DUPLICATE KEY UPDATE

insert into goods values (1, 'john', '2021-01-02');
insert into goods (id, name, updateat)
 values (1, 'john', '2021-01-03')
 ON DUPLICATE KEY UPDATE 
 updateat = greatest('2021-01-03', 
                     (select updateat from (select * from goods as g) as g where id = 1))

Fiddle

【讨论】:

  • 非常感谢,有没有不加主键的办法?因为我需要保证表的结构不变。
【解决方案2】:

Mysql 使用INSERT ON...DUPLICATE 而不是合并。此语句允许您在识别出重复条目时根据检查对您的情况进行修改。可以使用主键或唯一索引来识别重复条目。下面的演示和工作 db fiddle 根据您的标准提供了一个示例。

  1. 使用唯一索引来识别重复条目
  2. INSERT ON...DUPLICATEVALUES(用于标识当前插入的值)和一个大小写表达式一起使用,以确定哪个updatedat 日期较新。
CREATE TABLE `goods` (
  `id` int NOT NULL ,
  `name` varchar(25) ,
  `updateat` datetime 
);
-- use a unique index if you are interested in ensuring a subset of columns are unique and 
-- these columns do not meet the criteria to be a primary/composite key based on your database design
create unique index uk_id_name on  goods(id,name);
insert into goods values (1,'new','2021-12-18 12:00:00');
-- this should fail because of the duplicate unique index
insert into goods values (1,'new','2021-12-18 12:00:00');
键“uk_id_name”的重复条目“1-new”
select * from goods;
编号 |姓名 |更新 -: | :--- | :----------------- 1 |新 | 2021-12-18 12:00:00
insert into goods values (1,'new','2021-12-18 12:00:01')
on duplicate key update updateat= CASE 
   WHEN updateat > VALUES(updateat) THEN updateat
   ELSE VALUES(updateat)
END;
select * from goods;
编号 |姓名 |更新 -: | :--- | :----------------- 1 |新 | 2021-12-18 12:00:01

db小提琴here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-08
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    相关资源
    最近更新 更多