mysql-增量更新

1、建表及插入数据
sql 复制代码
create table `t1` (
  `order_no` varchar(50) not null,
  `date_day` date not null,
  `province_name` varchar(100) default null,
  `city_name` varchar(100) default null,
  primary key (`order_no`),
  key `idx_date_day` (`date_day`)
) engine=innodb default charset=utf8mb4


create table `t2` (
  `order_no` varchar(50) not null,
  `date_day` date not null,
  `province_name` varchar(100) default null,
  `city_name` varchar(100) default null,
  primary key (`order_no`),
  key `idx_date_day` (`date_day`)
) engine=innodb default charset=utf8mb4



insert into t1 (order_no, date_day, province_name, city_name) values ('ord123456', '2024-01-01', '广东省', '广州市');
insert into t1 (order_no, date_day, province_name, city_name) values ('ord789012', '2024-02-01', '江苏省', '南京市');
insert into t1 (order_no, date_day, province_name, city_name) values ('ord789013', '2024-02-01', '湖北省', '武汉市');
insert into t1 (order_no, date_day, province_name, city_name) values ('ord789014', '2024-02-01', '广东省', null);
2、增量更新
sql 复制代码
insert into t2 (
    order_no,
    date_day,
    province_name,
    city_name
)
select
    t1.order_no,
    t1.date_day,
    t1.province_name,
    t1.city_name
from t1
on duplicate key update
    date_day = values(date_day),
    province_name = values(province_name),
    city_name = values(city_name);

REPLACE INTO 是 MySQL 中用于插入新记录或替换已有记录的命令。它的工作原理是:如果表中有一个唯一索引(如主键或 UNIQUE 约束),并且尝试插入的行与现有行在该唯一索引上存在冲突,那么 REPLACE INTO 会先删除现有的行,然后插入新的行。

使用 REPLACE INTO 要小心,因为它会导致数据丢失(当旧行被删除时)。如果只是想更新已有的记录而不是删除并重新插入它们,应该考虑使用 INSERT ... ON DUPLICATE KEY UPDATE 或者 UPDATE 命令。

下面是一个简单的例子:

假设我们有一个名为 users 的表,其结构如下:

sql 复制代码
create table users (
    id int not null auto_increment,
    username varchar(50) not null,
    email varchar(100),
    primary key (id),
    unique (username)
);

现在我们要向这个表中添加或更新用户信息:

sql 复制代码
REPLACE INTO users (id, username, email) VALUES (1, 'alice', 'alice@example.com');

如果 users 表中没有 id 为 1 的记录,这条语句将简单地插入一条新记录。但如果已经存在 id 为 1 的记录,MySQL 将首先删除这条记录,然后再插入新提供的值。

需要注意的是,如果 username 列上有唯一的约束 ,并且尝试插入一个已经存在的 username,即使 id 不同,也会触发 REPLACE 操作,导致拥有相同 username 的原有记录被删除,新记录被插入。

再次提醒,使用 REPLACE INTO 可能会导致意外的数据丢失,请确保这是想要的操作。如果你只想更新某些列的值而不影响其他列,或者你想保留原有的行ID,应该选择更安全的方式,比如 ON DUPLICATE KEY UPDATE

相关推荐
就叫飞六吧10 分钟前
MySQL不停机迁移完全指南
数据库·mysql
猎人everest34 分钟前
Windows系统Redis(8.2.2)安装与配置完整教程
数据库·windows·redis
苦学编程的谢38 分钟前
Redis_10_Zset
数据库·redis·缓存
q***420540 分钟前
在Spring Boot项目中使用MySQL数据库
数据库·spring boot·mysql
我系真滴菜1 小时前
SQLiteStudio基本操作教程
数据库
q***49861 小时前
在Django中安装、配置、使用CKEditor5,并将CKEditor5录入的文章展现出来,实现一个简单博客网站的功能
数据库·django·sqlite
q***18062 小时前
如何使用C#与SQL Server数据库进行交互
数据库·c#·交互
Wang's Blog2 小时前
MySQL: 操作系统对MySQL性能的影响及选型指南
数据库·mysql
Lucifer三思而后行2 小时前
Oracle ADG 配置闪回导致报表查询延时!
数据库·oracle
挨踢攻城2 小时前
【OCP考试喜报】2025.11月 ORACLE OCP 考试通过
数据库·mysql·oracle·dba·oracle ocp·公众号:厦门微思网络·ocp19c