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_number
101 그리고 잘못된 것을 고칩니다.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
'programing' 카테고리의 다른 글
GUI 없이 Excel(xls) 파일을 쉼표로 구분된(csv) 파일로 변환 (0) | 2023.06.18 |
---|---|
Duplicate User Form in Excel VBA (0) | 2023.06.18 |
int*i와 int*i의 차이 (0) | 2023.06.18 |
웹 API에서 요청과 일치하는 여러 작업이 발견되었습니다. (0) | 2023.06.18 |
python 사전을 csv 파일로 작성하려면 어떻게 해야 합니까? (0) | 2023.06.18 |