CHÈN VÀO… CHỌN cho tất cả các cột MySQL


119

Tôi đang cố gắng di chuyển dữ liệu cũ từ:

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 giống hệt nhau và được idđặt làm khóa chính.


1
Xác định "nó không hoạt động". Tôi đang gặp những gì có thể là một vấn đề tương tự nhưng tôi không thể nói vì bạn đã không nói vấn đề của bạn là gì !!
Các cuộc đua ánh sáng trong quỹ đạo vào

Nó không bị hỏng, nó chỉ không hoạt động.
Webmaster G

Câu trả lời:


218

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


73

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

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

Để 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

6
+1 cho phép nối bên trái để tránh xung đột khóa chính.
Hartley Brody

23

Bổ sung cho câu trả lời của Mark Byers:

Đôi khi bạn cũng muốn chèn các chi tiết Hardcoded nếu không có thể có ràng buộc Duy nhất không thành công, v.v. Vì vậy, hãy sử dụng cách làm sau trong trường hợp bạn ghi đè một số giá trị của 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 giá trị miền được tôi thêm vào theo cách Hardcoded để thoát khỏi ràng buộc Unique.


4

bạn không cần double () cho bit giá trị? nếu không hãy thử cách này (mặc dù phải có 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'));

2
OP đang sử dụng INSERT INTO .. SELECT FROM, không phải INSERT INTO .. VALUES. Tính năng khác nhau.
Các cuộc đua ánh sáng trong quỹ đạo vào

0

Thêm ví dụ & chi tiết

    INSERT INTO vendors (
     name, 
     phone, 
     addressLine1,
     addressLine2,
     city,
     state,
     postalCode,
     country,
     customer_id
 )
 SELECT 
     name,
     phone,
     addressLine1,
     addressLine2,
     city,
     state ,
     postalCode,
     country,
     customer_id
 FROM 
     customers;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.