Jak mogę scalić dwie tabele MySQL o tej samej strukturze?
Klucze podstawowe obu tabel będą ze sobą kolidować, więc wziąłem to pod uwagę.
Jak mogę scalić dwie tabele MySQL o tej samej strukturze?
Klucze podstawowe obu tabel będą ze sobą kolidować, więc wziąłem to pod uwagę.
Odpowiedzi:
Możesz też spróbować:
INSERT IGNORE
INTO table_1
SELECT *
FROM table_2
;
co pozwala tym wierszom w tabeli_1 zastąpić wiersze w tabeli_2, które mają zgodny klucz podstawowy, jednocześnie wstawiając wiersze z nowymi kluczami podstawowymi.
Alternatywnie,
REPLACE
INTO table_1
SELECT *
FROM table_2
;
zaktualizuje te wiersze już w tabeli_1 o odpowiadające im wiersze z tabeli_2, podczas wstawiania wierszy z nowymi kluczami podstawowymi.
Zależy to od semantyki klucza podstawowego. Jeśli to tylko autoinkrementacja, użyj czegoś takiego:
insert into table1 (all columns except pk)
select all_columns_except_pk
from table2;
Jeśli PK coś znaczy, musisz znaleźć sposób na określenie, który rekord powinien mieć priorytet. Możesz utworzyć zapytanie wybierające, aby najpierw znaleźć duplikaty (patrz odpowiedź według cpitis ). Następnie usuń te, których nie chcesz zachować i użyj powyższej wstawki, aby dodać pozostałe rekordy.
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
- przez MySQL Workbench jakikolwiek.
Jeśli musisz to zrobić ręcznie, jednorazowo:
Najpierw połącz tabelę tymczasową z czymś takim:
create table MERGED as select * from table 1 UNION select * from table 2
Następnie zidentyfikuj ograniczenia klucza podstawowego za pomocą czegoś takiego jak
SELECT COUNT(*), PK from MERGED GROUP BY PK HAVING COUNT(*) > 1
Gdzie PK to pole klucza podstawowego ...
Rozwiąż duplikaty.
Zmień nazwę tabeli.
[edytowano - usunięto nawiasy w zapytaniu UNION, które powodowały błąd w komentarzu poniżej]
Nie jest to tak skomplikowane, jak się wydaje ... Po prostu pozostaw zduplikowany klucz podstawowy poza swoim zapytaniem ... to działa dla mnie!
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
Możesz napisać skrypt, który zaktualizuje dla Ciebie FK. Zajrzyj na tego bloga: http://multunus.com/2011/03/how-to-easily-merge-two-identical-mysql-databases/
Mają sprytny skrypt, który wykorzystuje tabele information_schema do pobierania kolumn „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;