2011-03-09 42 views
78

Tôi đang cố gắng để di chuyển dữ liệu cũ từ:INSERT INTO ... SELECT cho tất cả các cột MySQL

this_table >>this_table_archive

sao chép tất cả các cột trên. Tôi đã thử điều này, nhưng nó không hoạt động:

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

Lưu ý: các bảng là giống hệt nhau và có id bộ như một khóa chính.

+1

Xác định "nó không hoạt động". Tôi đang có những gì có thể là một vấn đề tương tự nhưng tôi không thể nói bởi vì bạn đã không nói những gì vấn đề của bạn là !! –

+0

Nó không bị hỏng, nó không hoạt động. –

+0

Xem thêm tại đây [https://stackoverflow.com/questions/3709560/joining-three-tables-using-mysql](https://stackoverflow.com/questions/3709560/joining-three-tables-using-mysql) –

Trả lời

152

Cú pháp chính xác được mô tả trong manual. Hãy thử điều này:

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

Nếu các cột id là một cột tự động tăng và bạn đã có một số dữ liệu trong cả hai bảng sau đó trong một số trường hợp, bạn có thể muốn bỏ qua id từ danh sách cột và tạo id mới thay vào đó tránh chèn một id đã tồn tại trong bảng gốc. Nếu bảng mục tiêu của bạn trống thì đây không phải là vấn đề.

51

Đối với cú pháp, nó trông giống như thế này (bỏ qua danh sách cột để ngầm có nghĩa là "tất cả")

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

Đối tránh lỗi khóa chính nếu bạn đã có dữ liệu trong bảng lưu trữ

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 để tham gia trái để tránh xung đột chính. –

4

bạn không cần double() cho bit giá trị? nếu không thử loại này (mặc dù có phải là một cách tốt hơn

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 đang sử dụng 'INSERT INTO .. ​​SELECT FROM', không phải' INSERT INTO .. ​​VALUES'. Tính năng khác nhau. –

15

Addition Mark Byers câu trả lời:

Đôi khi bạn cũng muốn chèn hardcoded chi tiết khác có thể có khó khăn Unique thất bại vv Vì vậy, sử dụng sau trong tình huống như vậy, nơi bạn ghi đè lên một số giá trị của các cột.

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

đây miền giá trị được bổ sung bởi tôi cho tôi theo cách mã hóa cứng để thoát khỏi từ Hạn chế duy nhất.

Các vấn đề liên quan