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
。