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

相关推荐
行者游学18 分钟前
ETCD 集群备份与恢复
数据库·etcd
行者游学20 分钟前
ETCD 学习使用
数据库·学习·etcd
代码程序猿RIP21 分钟前
【Etcd 】Etcd 详解以及安装教程
linux·数据库·etcd
tqs_123451 小时前
创建es索引
数据库·es
间彧1 小时前
Mysql优化指南:善用覆盖索引,提升查询效率
数据库
间彧1 小时前
MySQL优化指南:执行计划type字段详解
数据库
合作小小程序员小小店2 小时前
web网页,在线%抖音,舆情%分析系统demo,基于python+web+echart+nlp+知识图谱,数据库mysql
数据库·python·自然语言处理·flask·nlp·echarts·知识图谱
一个天蝎座 白勺 程序猿2 小时前
Apache IoTDB(8):时间序列管理——从创建到分析的实战指南
数据库·apache·时序数据库·iotdb
摇滚侠3 小时前
Oracle 数据库修改表名
数据库·oracle