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?

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

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

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;

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


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;


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. :-)


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


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.