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

相关推荐
阳冬园9 分钟前
mysql数据库 主从同步
数据库·主从同步
Mr.131 小时前
数据库的三范式是什么?
数据库
Cachel wood1 小时前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架
Python之栈2 小时前
【无标题】
数据库·python·mysql
风_流沙2 小时前
java 对ElasticSearch数据库操作封装工具类(对你是否适用嘞)
java·数据库·elasticsearch
亽仒凣凣2 小时前
Windows安装Redis图文教程
数据库·windows·redis
亦世凡华、2 小时前
MySQL--》如何在MySQL中打造高效优化索引
数据库·经验分享·mysql·索引·性能分析
YashanDB2 小时前
【YashanDB知识库】Mybatis-Plus调用YashanDB怎么设置分页
数据库·yashandb·崖山数据库
ProtonBase2 小时前
如何从 0 到 1 ,打造全新一代分布式数据架构
java·网络·数据库·数据仓库·分布式·云原生·架构
云和数据.ChenGuang7 小时前
Django 应用安装脚本 – 如何将应用添加到 INSTALLED_APPS 设置中 原创
数据库·django·sqlite