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

相关推荐
知识分享小能手21 分钟前
MongoDB入门学习教程,从入门到精通,在生产环境中设置MongoDB(21)
数据库·学习·mongodb
XDHCOM36 分钟前
ORA-12445报错:无法更改列隐藏属性,Oracle故障修复与远程处理,网友推荐解决方案
数据库·oracle
麒麟ZHAO41 分钟前
鸿蒙flutter第三方库适配 - 文件对比工具
数据库·redis·flutter·华为·harmonyos
香蕉鼠片43 分钟前
Redis
数据库·redis·缓存
翻斗包菜44 分钟前
第 03 章 Python 操作 MySQL 数据库实战全解
数据库·python·mysql
SPC的存折1 小时前
1、MySQL故障排查与运维案例
linux·运维·服务器·数据库·mysql
小臭希1 小时前
Redis(NoSQL数据库,Linux-Ubuntu环境下)
数据库·redis·缓存
cdcdhj1 小时前
在window下将Mongodb单机改为副本集,只用于测试环境,实际上并没有增加真的副本集
数据库·mongodb
xcjbqd01 小时前
如何修改Oracle服务器默认的日期格式_NLS_DATE_FORMAT全局配置
jvm·数据库·python
HealthScience1 小时前
SpliceVarDB数据集说明
数据库·oracle