W MySQL, jak skopiować zawartość jednej tabeli do innej tabeli w tej samej bazie danych?

118

Jestem nowy w MySQL. Chciałbym skopiować zawartość jednej tabeli do innej tabeli w tej samej bazie danych. Zasadniczo chciałbym wstawić do tabeli z innej tabeli. Czy jest na to łatwy sposób?

Joneph O.
źródło

Odpowiedzi:

184

INSERT INTO TARGET_TABLE SELECT * FROM SOURCE_TABLE;

EDYCJA: lub jeśli tabele mają różne struktury, możesz również:

INSERT INTO TARGET_TABLE (`col1`,`col2`) SELECT `col1`,`col2` FROM SOURCE_TABLE;

EDYCJA: aby to ograniczyć ..

INSERT INTO TARGET_TABLE (`col1_`,`col2_`) SELECT `col1`,`col2` FROM SOURCE_TABLE WHERE `foo`=1
ggiroux
źródło
Co się stanie, jeśli ktoś będzie chciał wykonać operacje wstawiania w tabeli źródłowej podczas wykonywania tego zapytania? blokuje operację wkładki czy nie?
Lawakush Kurmi
135

Jeśli tabela nie istnieje, możesz ją utworzyć z takim samym schematem:

CREATE TABLE table2 LIKE table1;

Następnie, aby skopiować dane:

INSERT INTO table2 SELECT * FROM table1
GSto
źródło
1
Znalazłem ten kod SELECT * INTO newTable FROM sourceTablew w3school , dlaczego nie działaMySQL
Kasun Siyambalapitiya
@KasunSiyambalapitiya SELECT ... INTOsłuży do eksportowania tabeli do pliku wyjściowego lub do zmiennych; nie bezpośrednio do stołu. Zobacz dev.mysql.com/doc/refman/5.7/en/select-into.html
Doktor J
@Kasun Siyambalapitiya, że ​​strona w3school jest przeznaczona dla innego SQL, nieprzeznaczonego dla MySQL. w3schools ma teraz raportowanie błędów, jeśli znajdziesz problemy, zgłoś je na swojej stronie, aby pomóc w uzyskaniu dokładnej wiedzy.
Nightwolf
27

Jeśli tabela1 jest duża i nie chcesz jej blokować na czas kopiowania, możesz zamiast tego wykonać zrzut i załadować:

CREATE TABLE table2 LIKE table1;

SELECT * INTO OUTFILE '/tmp/table1.txt' FROM table1;
LOAD DATA INFILE '/tmp/table1.txt' INTO TABLE table2;
Ike Walker
źródło
Próbowałem zrzucić na RDS, używając rozwiązania stackoverflow.com/a/9536680/351903 . Plik został utworzony, ale przez długi czas pozostawał rozmiar 0. Podczas sprawdzania show processlistnie widziałem uruchomionego żadnego zapytania. Nie wiem, o co chodzi.
Sandeepan Nath
15

To zadziałało dla mnie,

CREATE TABLE newtable LIKE oldtable;

Replikuje newtable ze starym stołem

INSERT newtable SELECT * FROM oldtable;

Kopiuje wszystkie dane wiersza do nowej tabeli.

Dziękuję Ci

Jason
źródło
10

Jeśli chcesz stworzyć i skopiować zawartość w jednym ujęciu, po prostu użyj SELECT:

UTWÓRZ TABELĘ new_tbl SELECT * FROM orig_tbl;

Frank Heikens
źródło
4
+1 - chociaż nowa tabela nie będzie miała definicji indeksu z pierwszej. Podejście "utwórz ... jak ..." spowoduje również skopiowanie definicji indeksu.
Martin
2

To zadziałało dla mnie. Możesz uczynić instrukcję SELECT bardziej złożoną za pomocą klauzul WHERE i LIMIT.

Najpierw zduplikuj dużą tabelę (bez danych), uruchom następujące zapytanie, a następnie obetnij większą tabelę.

INSERT INTO table_small (SELECT * FROM table_large WHERE column = 'value' LIMIT 100)

Super proste. :-)

Sandor Fekete
źródło
0
CREATE TABLE target_table SELECT * FROM source_table;

Po prostu tworzy nową tabelę z taką samą strukturą jak tabela źródłowa, a także kopiuje wszystkie wiersze z tabeli źródłowej do tabeli docelowej.

CREATE TABLE target_table SELECT * FROM source_table WHERE condition;

Jeśli chcesz skopiować jakieś wiersze do target_table, zastosuj warunek wewnątrz klauzuli where

CelinVeronicca
źródło
-3

Spróbuj tego. Działa dobrze w mojej Oracle 10g,

CREATE TABLE new_table
  AS (SELECT * FROM old_table);
RAHUL KUMAR
źródło
8
Ale pytanie dotyczy MySQL.
Salman A
Dał za to +, ponieważ działa też z MySQL. dev.mysql.com/doc/refman/5.7/en/create-table-select.html
Daniel