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

相关推荐
Hello.Reader2 小时前
RedisJSON 路径语法深度解析与实战
数据库·redis·缓存
TDengine (老段)3 小时前
TDengine 使用最佳实践(2)
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
设计师小聂!6 小时前
Linux系统中部署Redis详解
linux·运维·数据库·redis
kfepiza6 小时前
Debian-10编译安装Mysql-5.7.44 笔记250706
linux·数据库·笔记·mysql·debian·bash
Touper.6 小时前
Redis 基础详细介绍(Redis简单介绍,命令行客户端,Redis 命令,Java客户端)
java·数据库·redis
不剪发的Tony老师6 小时前
phpMyAdmin:一款经典的MySQL在线管理工具又回来了
数据库·mysql·phpmyadmin
极限实验室6 小时前
TDBC 2025 可信数据库发展大会,极限科技邀您来赴约!
数据库
lixia0417mul28 小时前
使用Starrocks替换Clickhouse的理由
数据库
张璐月8 小时前
mysql的性能优化:组提交、数据页复用、全表扫描优化、刷脏页
数据库·mysql·性能优化
沐尘而生9 小时前
【AI智能体】智能音视频-搭建可视化智能体
数据库·人工智能·ai作画·音视频·娱乐