ฉันจะรวมตาราง MySQL สองตารางได้อย่างไร


94

ฉันจะรวมตาราง MySQL สองตารางที่มีโครงสร้างเดียวกันได้อย่างไร

คีย์หลักของสองตารางจะปะทะกันดังนั้นฉันจึงคำนึงถึงสิ่งนั้นด้วย


6
เมื่อคุณบอกว่า PK อาจปะทะกันคุณหมายความว่าอาจมีแถวที่ซ้ำกันและคุณไม่ต้องการให้คัดลอกหรือคุณจำเป็นต้องกำหนด PK ใหม่ให้กับหนึ่งในนั้นเนื่องจากแถวนั้นต่างกันมากแม้ว่าจะมี PK เหมือนกัน? (อีกเหตุผลหนึ่งที่ต้องใช้คีย์หลักตามธรรมชาติ)
Tom H

คำตอบ:


124

คุณยังสามารถลอง:

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 ในขณะที่แทรกแถวด้วยคีย์หลักใหม่


2
จริงๆแล้วมันจะแทนที่แถวที่มีอยู่ (ลบ + แทรก) ไม่ใช่การอัปเดต
Cees Timmerman

แล้วถ้ามี Foreign Key ใช้สำหรับตาราง 2 ล่ะ ????? คุณจะอัปเดตอย่างไร
Kshitiz

39

ขึ้นอยู่กับความหมายของคีย์หลัก หากเป็นเพียงการสร้างอัตโนมัติให้ใช้สิ่งต่อไปนี้

insert into table1 (all columns except pk)
select all_columns_except_pk 
from table2;

หาก PK หมายถึงบางสิ่งคุณต้องหาวิธีพิจารณาว่าบันทึกใดควรมีลำดับความสำคัญ คุณสามารถสร้าง Select Query เพื่อค้นหารายการที่ซ้ำกันก่อนได้ (ดูคำตอบโดย cpitis ) จากนั้นกำจัดสิ่งที่คุณไม่ต้องการเก็บและใช้ส่วนแทรกด้านบนเพื่อเพิ่มระเบียนที่ยังคงอยู่


22
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)

1
ขอบคุณสำหรับความคิดที่ดี cmd ด้านบนทำให้ฉันมีข้อผิดพลาดทางไวยากรณ์ แต่สิ่งนี้ใช้ได้กับฉัน: INSERT INTO first_table SELECT * FROM second_table ON DUPLICATE KEY UPDATE second_table.column1 = DO_WHAT_EVER_MUST_BE_DONE_ON_KEY_CLASH (first_table.column1)
Tapper

เช่นเดียวกับ @Tapper ฉันไม่สามารถกำหนดนามแฝงให้กับตารางแรกได้ ฉันจะได้รับSyntax error, unexpected IDENT_QUOTED- ผ่าน MySQL Workbench อย่างไรก็ตาม
blo0p3r

คุณช่วยยกตัวอย่างคำสั่งที่คุณจะป้อนในบรรทัดสุดท้ายได้ไหม ฉันต้องการให้ ID เพิ่มขึ้นจาก ID ที่มีอยู่สูงสุดในตาราง
Elliott B

15

หากคุณต้องการดำเนินการด้วยตนเองเพียงครั้งเดียว:

ขั้นแรกรวมเข้ากับตารางชั่วคราวโดยมีสิ่งที่ต้องการ:

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 ซึ่งทำให้เกิดข้อผิดพลาดในความคิดเห็นด้านล่าง]


เมื่อฉันลองสิ่งนี้ฉันได้รับข้อผิดพลาดนี้ "ERROR 1064 (42000): คุณมีข้อผิดพลาดในไวยากรณ์ SQL ของคุณตรวจสอบคู่มือที่สอดคล้องกับเวอร์ชันเซิร์ฟเวอร์ MySQL ของคุณสำหรับไวยากรณ์ที่ถูกต้องเพื่อใช้ใกล้ 'UNION เลือก * จากนักแสดง)' ที่บรรทัด "ทำไมถึงเป็นเช่นนั้น?
jcho360

7

ไม่ซับซ้อนอย่างที่คิด .... เพียงแค่ปล่อยคีย์หลักที่ซ้ำกันออกจากข้อความค้นหาของคุณ .... สิ่งนี้ใช้ได้กับฉัน!

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

0

คุณสามารถเขียนสคริปต์เพื่ออัปเดต 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;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.