ฉันจะรวมตาราง MySQL สองตารางที่มีโครงสร้างเดียวกันได้อย่างไร
คีย์หลักของสองตารางจะปะทะกันดังนั้นฉันจึงคำนึงถึงสิ่งนั้นด้วย
ฉันจะรวมตาราง MySQL สองตารางที่มีโครงสร้างเดียวกันได้อย่างไร
คีย์หลักของสองตารางจะปะทะกันดังนั้นฉันจึงคำนึงถึงสิ่งนั้นด้วย
คำตอบ:
คุณยังสามารถลอง:
INSERT IGNORE
INTO table_1
SELECT *
FROM table_2
;
ซึ่งทำให้แถวเหล่านั้นใน table_1 สามารถแทนที่แถวใน table_2 ที่มีคีย์หลักที่ตรงกันในขณะที่ยังคงแทรกแถวด้วยคีย์หลักใหม่
หรืออีกทางหนึ่ง
REPLACE
INTO table_1
SELECT *
FROM table_2
;
จะอัปเดตแถวเหล่านั้นแล้วใน table_1 ด้วยแถวที่เกี่ยวข้องจาก table_2 ในขณะที่แทรกแถวด้วยคีย์หลักใหม่
ขึ้นอยู่กับความหมายของคีย์หลัก หากเป็นเพียงการสร้างอัตโนมัติให้ใช้สิ่งต่อไปนี้
insert into table1 (all columns except pk)
select all_columns_except_pk
from table2;
หาก PK หมายถึงบางสิ่งคุณต้องหาวิธีพิจารณาว่าบันทึกใดควรมีลำดับความสำคัญ คุณสามารถสร้าง Select Query เพื่อค้นหารายการที่ซ้ำกันก่อนได้ (ดูคำตอบโดย cpitis ) จากนั้นกำจัดสิ่งที่คุณไม่ต้องการเก็บและใช้ส่วนแทรกด้านบนเพื่อเพิ่มระเบียนที่ยังคงอยู่
INSERT
INTO first_table f
SELECT *
FROM second_table s
ON DUPLICATE KEY
UPDATE
s.column1 = DO_WHAT_EVER_MUST_BE_DONE_ON_KEY_CLASH(f.column1)
Syntax error, unexpected IDENT_QUOTED
- ผ่าน MySQL Workbench อย่างไรก็ตาม
หากคุณต้องการดำเนินการด้วยตนเองเพียงครั้งเดียว:
ขั้นแรกรวมเข้ากับตารางชั่วคราวโดยมีสิ่งที่ต้องการ:
create table MERGED as select * from table 1 UNION select * from table 2
จากนั้นระบุข้อ จำกัด ของคีย์หลักด้วยสิ่งต่างๆเช่น
SELECT COUNT(*), PK from MERGED GROUP BY PK HAVING COUNT(*) > 1
โดยที่ PK คือฟิลด์คีย์หลัก ...
แก้ปัญหาที่ซ้ำกัน
เปลี่ยนชื่อตาราง
[แก้ไข - ลบวงเล็บในคำค้นหา UNION ซึ่งทำให้เกิดข้อผิดพลาดในความคิดเห็นด้านล่าง]
ไม่ซับซ้อนอย่างที่คิด .... เพียงแค่ปล่อยคีย์หลักที่ซ้ำกันออกจากข้อความค้นหาของคุณ .... สิ่งนี้ใช้ได้กับฉัน!
INSERT INTO
Content(
`status`,
content_category,
content_type,
content_id,
user_id,
title,
description,
content_file,
content_url,
tags,
create_date,
edit_date,
runs
)
SELECT `status`,
content_category,
content_type,
content_id,
user_id,
title,
description,
content_file,
content_url,
tags,
create_date,
edit_date,
runs
FROM
Content_Images
คุณสามารถเขียนสคริปต์เพื่ออัปเดต FK ให้คุณได้ .. ดูบล็อกนี้: http://multunus.com/2011/03/how-to-easily-merge-two-identical-mysql-databases/
พวกเขามีสคริปต์ที่ชาญฉลาดในการใช้ตาราง information_schema เพื่อรับคอลัมน์ "id":
SET @db:='id_new';
select @max_id:=max(AUTO_INCREMENT) from information_schema.tables;
select concat('update ',table_name,' set ', column_name,' = ',column_name,'+',@max_id,' ; ') from information_schema.columns where table_schema=@db and column_name like '%id' into outfile 'update_ids.sql';
use id_new
source update_ids.sql;