Jak połączyć dwie tabele MySQL?

Jak połączyć dwie tabele MySQL o tej samej strukturze?

Podstawowe klucze obu tabel będą się ze sobą kolidować, więc wziąłem to pod uwagę.

Author: dakab, 2009-04-07

6 answers

Możesz również spróbować:

INSERT IGNORE
  INTO table_1 
SELECT *
  FROM table_2
     ;

Który pozwala tym wierszom w tabeli_1 zastąpić te w tabeli_2, które mają pasujący 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 odpowiedni wiersz z tabeli_2, wstawiając wiersze z nowymi kluczami podstawowymi.

 112
Author: fcw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-07 13:04:18

To zależy od semantyki klucza głównego. Jeśli to tylko autoincrement, to użyj czegoś w stylu:

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

Jeśli PK coś znaczy, musisz znaleźć sposób, aby określić, który rekord powinien mieć priorytet. Możesz utworzyć zapytanie select, aby najpierw znaleźć duplikaty (Zobacz odpowiedź cpitis ). Następnie wyeliminuj te, których nie chcesz zachować i użyj powyższej wstawki, aby dodać rekordy, które pozostały.

 36
Author: Milan Babuškov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:20
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)
 21
Author: Quassnoi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-05 13:32:14

Jeśli musisz zrobić to ręcznie, jeden raz:

Najpierw połącz w tymczasowej tabeli, z czymś w rodzaju:

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

Następnie zidentyfikuj podstawowe ograniczenia klucza za pomocą czegoś w rodzaju

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

Gdzie PK jest głównym polem klucza...

Rozwiąż duplikaty.

Zmień nazwę tabeli.

[edited-usunięto nawiasy w zapytaniu UNION, co powodowało błąd w komentarzu poniżej]

 15
Author: Cătălin Pitiș,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-28 11:34:42

Nie tak skomplikowane, jak się wydaje.... Po prostu zostaw zduplikowany klucz podstawowy z twojego zapytania.... to mi pasuje !

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
 6
Author: Bill Warren,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-17 18:57:52

Możesz napisać skrypt, który zaktualizuje FK za Ciebie.. zobacz ten blog: http://multunus.com/2011/03/how-to-easily-merge-two-identical-mysql-databases/

Mają sprytny skrypt do korzystania z tabel information_schema, aby uzyskać kolumny "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;
 0
Author: TimoSolo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-20 13:35:19