2011-03-09 14 views
78

Próbuję przenieść stare dane z:INSERT INTO ... SELECT dla wszystkich kolumn MySQL

this_table >>this_table_archive

kopiowanie nad wszystkie kolumny. Próbowałem to, ale to nie działa:

INSERT INTO this_table_archive (*) VALUES (SELECT * FROM this_table WHERE entry_date < '2011-01-01 00:00:00');

Uwaga: stoliki są identyczne i mają id Ustawić jako klucz podstawowy.

+1

Zdefiniuj "to nie działa". Mam problem, który może być podobny, ale nie mogę powiedzieć, ponieważ nie powiedziałeś, co to jest twój problem! –

+0

Nie jest zepsuty, po prostu nie działa. –

+0

Zobacz również tutaj [https://stackoverflow.com/questions/3709560/joining-three-tables-using-mysql](https://stackoverflow.com/questions/3709560/joining-three-tables-using-mysql) –

Odpowiedz

152

Poprawna składnia jest opisana w manual. Spróbuj tego:

INSERT INTO this_table_archive (col1, col2, ..., coln) 
SELECT col1, col2, ..., coln 
FROM this_table 
WHERE entry_date < '2011-01-01 00:00:00'; 

Jeśli kolumn id jest kolumną automatycznego przyrostu i masz już jakieś dane w obu tabelach następnie w niektórych przypadkach może chcesz pominąć identyfikator z listy kolumnowej i generowania nowych identyfikatorów zamiast unikaj wstawiania identyfikatora, który już istnieje w oryginalnej tabeli. Jeśli twoja tabela docelowa jest pusta, to nie będzie to problemem.

51

Dla składni, wygląda to tak (opuścić listę kolumn do domyśle znaczy „wszystko”)

INSERT INTO this_table_archive 
SELECT * 
FROM this_table 
WHERE entry_date < '2011-01-01 00:00:00' 

Dla uniknięcia klucza podstawowego błędy, jeśli masz już dane w tabeli archiwum

INSERT INTO this_table_archive 
SELECT t.* 
FROM this_table t 
LEFT JOIN this_table_archive a on a.id=t.id 
WHERE t.entry_date < '2011-01-01 00:00:00' 
    AND a.id is null # does not yet exist in archive 
+4

+1 dla lewego sprzężenia, aby uniknąć kolizji kluczy podstawowych. –

4

Nie potrzebujesz podwójnego() dla wartości bitów? jeśli nie spróbować (choć nie musi być lepszy sposób

insert into this_table_archive (id, field_1, field_2, field_3) 
values 
((select id from this_table where entry_date < '2001-01-01'), 
((select field_1 from this_table where entry_date < '2001-01-01'), 
((select field_2 from this_table where entry_date < '2001-01-01'), 
((select field_3 from this_table where entry_date < '2001-01-01')); 
+1

OP używa 'INSERT INTO .. ​​SELECT FROM', a nie' INSERT INTO .. ​​VALUES'. Różne funkcje. –

15

Dodawanie do Mark Byers odpowiedź:

Czasami chcemy także, aby wstawić Hardcoded dane innego nie może być UNIQUE nie itp więc używać idąc w takiej sytuacji, w której przesłonić pewne wartości z kolumn.

INSERT INTO matrimony_domain_details (domain, type, logo_path) 
SELECT 'www.example.com', type, logo_path 
FROM matrimony_domain_details 
WHERE id = 367 

Tutaj domeny wartość dodana przeze mnie ja w ustalony sposób, aby pozbyć się z Unikalne ograniczenie.