programing

MySQL: 다른 테이블의 값에서 테이블의 기존 데이터 "패치"

newstyles 2023. 6. 18. 12:26

MySQL: 다른 테이블의 값에서 테이블의 기존 데이터 "패치"

저는 구조가 똑같은 두 개의 테이블을 가지고 있습니다.첫 번째는 수정이 필요한 다른 시스템에서 가져온 레코드로 채워집니다(하나 이상의 열일 수 있음).두 번째 표는 첫 번째 표에 적용하고자 하는 수정 사항입니다.

예를 들어, 표 1에 다음 행이 있을 수 있습니다.

order_number | name         | email        | tracking_no
101            null           foo@bar.com    3456789
102            An Example     ex@ample.com   1010101

...그리고 표 2의 다음 행에 적용할 수정 사항:

order_number | name         | email        | tracking_no
101            Name Surname   null           null
102            null           null           45778901

기본적으로:누락된 항목 추가name로.order_number101 그리고 잘못된 것을 고칩니다.tracking_no위해서order_number 102.

제가 하려는 것의 논리는 다음과 같습니다: 표 1의 "패치" 값과 동일한 수정 사항이 포함되어 있습니다.order_number표 2에서 표 2의 값보다 우선하고 표 2의 해당 값이 null인 경우 표 1의 기존 값을 덮어쓰지 않습니다.

표 1에서 값이 null이고 표 2에서 null이 아닌 보정이 있는 경우,COALESCE올바른 방법인 것 같지만 표 2의 해당 "fix"로 이미 존재하는 값을 덮어쓰는 방법을 알 수 없습니다.

MySQL/MariaDB에는 매우 지저분한 "두 개의 테이블에서 두 개의 레코드를 가져와서 값을 비교하고 새 올바른 레코드를 빌드하여 테이블1에 다시 삽입"하는 메커니즘이 있습니까?

주석에서 지적한 것처럼, 다음은 표 구조와 함께 재현 가능한 테스트 데이터 집합입니다.

USE so_demo;

DROP TABLE IF EXISTS so_demo.table1;
DROP TABLE IF EXISTS so_demo.table2;

CREATE TABLE so_demo.table1 (
  order_number int(11) NOT NULL AUTO_INCREMENT,
  name varchar(50) DEFAULT NULL,
  email varchar(250) DEFAULT NULL,
  tracking_no varchar(255) DEFAULT NULL,
  PRIMARY KEY (order_number),
  UNIQUE INDEX UK_table1_order_number (order_number)
)
ENGINE = INNODB,
CHARACTER SET utf8mb4,
COLLATE utf8mb4_general_ci;

CREATE TABLE so_demo.table2 (
  order_number int(11) NOT NULL AUTO_INCREMENT,
  name varchar(50) DEFAULT NULL,
  email varchar(250) DEFAULT NULL,
  tracking_no varchar(255) DEFAULT NULL,
  PRIMARY KEY (order_number),
  UNIQUE INDEX UK_table2_order_number (order_number)
)
ENGINE = INNODB,
CHARACTER SET utf8mb4,
COLLATE utf8mb4_general_ci;

INSERT INTO so_demo.table1 VALUES (101, NULL, "foo@bar.com", 3456789);
INSERT INTO so_demo.table1 VALUES (102, "An Example", "ex@ample.com", 1010101);

INSERT INTO so_demo.table2 VALUES (101, "Name Surname", NULL, NULL);
INSERT INTO so_demo.table2 VALUES (102, NULL, NULL, 45778901);

찾고 있는 용어는 병합 및 mysql에서 중복 키 삽입입니다.

drop table if exists t,t1;

create table t(order_number int primary key, name  varchar(20)       , email  varchar(20), tracking_no int);
insert into t values
(101       ,     null       ,     'foo@bar.com'  ,  3456789),
(102       ,     'An Example',     'ex@ample.com' ,  1010101);

create table t1(order_number int, name  varchar(20), email  varchar(20), tracking_no int);
insert into t1 values
(101       ,     'Name Surname', null   ,        null),
(102       ,     null          , null   ,        '45778901');


insert into t
select * from t1
on duplicate key update
    t.name = case when t1.name is not null then t1.name else t.name end,
    t.email = case when t1.email is not null then t1.email else t.email end,
    t.tracking_no = case when t1.tracking_no is not null then t1.tracking_no else t.tracking_no end
;

select * from t;

+--------------+--------------+--------------+-------------+
| order_number | name         | email        | tracking_no |
+--------------+--------------+--------------+-------------+
|          101 | Name Surname | foo@bar.com  |     3456789 |
|          102 | An Example   | ex@ample.com |    45778901 |
+--------------+--------------+--------------+-------------+
2 rows in set (0.001 sec)

언급URL : https://stackoverflow.com/questions/65252173/mysql-patch-existing-data-on-a-table-from-values-in-another-table