Làm cách nào để hợp nhất hai bảng MySQL?


92

Làm cách nào để hợp nhất hai bảng MySQL có cùng cấu trúc?

Các khóa chính của hai bảng sẽ xung đột, vì vậy tôi đã tính đến điều đó.


6
Khi bạn nói rằng các PK có thể xung đột, bạn có nghĩa là có thể có các hàng trùng lặp và bạn không muốn sao chép chúng hoặc bạn cần chỉ định một PK mới cho một trong số chúng vì chúng thực sự khác hàng mặc dù có cùng PK? (thêm một lý do nữa để sử dụng khóa chính tự nhiên)
Tom H

Câu trả lời:


123

Bạn cũng có thể thử:

INSERT IGNORE
  INTO table_1 
SELECT *
  FROM table_2
     ;

cho phép các hàng đó trong bảng_1 thay thế các hàng trong bảng_2 có khóa chính phù hợp, trong khi vẫn chèn các hàng có khóa chính mới.

Ngoài ra,

REPLACE
   INTO table_1
 SELECT *
   FROM table_2
      ;

sẽ cập nhật các hàng đã có trong bảng_1 bằng hàng tương ứng từ bảng_2, đồng thời chèn các hàng có khóa chính mới.


2
Trên thực tế, nó sẽ THAY THẾ các hàng hiện có (xóa + chèn), không phải cập nhật.
Cees Timmerman

Còn nếu có bất kỳ khóa ngoại nào được sử dụng cho bảng 2 thì sao ????? Bạn sẽ cập nhật điều đó như thế nào?
Kshitiz

39

Nó phụ thuộc vào ngữ nghĩa của khóa chính. Nếu nó chỉ là autoincrement, thì hãy sử dụng một cái gì đó như:

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

Nếu PK có nghĩa là gì đó, bạn cần tìm cách xác định bản ghi nào cần được ưu tiên. Trước tiên, bạn có thể tạo một truy vấn chọn lọc để tìm các bản sao (xem câu trả lời của cpitis ). Sau đó, loại bỏ những cái bạn không muốn giữ lại và sử dụng phần chèn ở trên để thêm các bản ghi còn lại.


21
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
Cảm ơn vì ý tưởng tốt. Tuy nhiên, cmd trên cung cấp cho tôi một lỗi cú pháp. Nhưng điều này phù hợp với tôi: CHÈN VÀO CHỌN first_table * TỪ second_table TRÊN CẬP NHẬT KHÓA DUPLICATE second_table.column1 = DO_WHAT_EVER_MUST_BE_DONE_ON_KEY_CLASH (first_table.column1)
Tapper

Cũng giống như @Tapper, tôi không thể gán Bí danh cho bảng đầu tiên. Tôi sẽ nhận được Syntax error, unexpected IDENT_QUOTED- thông qua MySQL Workbench dù sao.
blo0p3r

Bạn có thể cung cấp một ví dụ về lệnh nào bạn sẽ nhập vào dòng cuối cùng không? Tôi muốn ID để tăng lên từ ID hiện cao nhất trong bảng
Elliott B

15

Nếu bạn cần làm điều đó theo cách thủ công, một lần:

Đầu tiên, hợp nhất trong một bảng tạm thời, với một cái gì đó như:

create table MERGED as select * from table 1 UNION select * from table 2

Sau đó, xác định các ràng buộc khóa chính bằng một số thứ như

SELECT COUNT(*), PK from MERGED GROUP BY PK HAVING COUNT(*) > 1

Trong đó PK là trường khóa chính ...

Giải quyết các bản sao.

Đổi tên bảng.

[đã chỉnh sửa - đã loại bỏ dấu ngoặc trong truy vấn UNION gây ra lỗi trong nhận xét bên dưới]


khi tôi thử điều này, tôi nhận được lỗi này, "ERROR 1064 (42000): Bạn có lỗi trong cú pháp SQL của mình; hãy kiểm tra hướng dẫn sử dụng tương ứng với phiên bản máy chủ MySQL của bạn để biết cú pháp phù hợp để sử dụng gần 'UNION select * from Actor)' tại dòng ”, tại sao vậy?
jcho360

7

Không phức tạp như nó có vẻ .... Chỉ cần để lại khóa chính trùng lặp khỏi truy vấn của bạn .... điều này phù hợp với tôi!

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

Bạn có thể viết một kịch bản để cập nhật FK cho bạn .. hãy xem blog này: http://multunus.com/2011/03/how-to-easily-merge-two-identical-mysql-databases/

Họ có một tập lệnh thông minh để sử dụng các bảng information_schema để lấy các cột "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;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.