Tôi không biết bạn lấy cú pháp đó ở đâu, nhưng COPY
không có danh sách các bí danh cột như vậy. Xem phần trợ giúp:
COPY table_name [ ( column_name [, ...] ) ]
FROM { 'filename' | PROGRAM 'command' | STDIN }
[ [ WITH ] ( option [, ...] ) ]
(AS
không phải là một trong những tùy chọn được liệt kê; để xem toàn bộ đầu ra, hãy chạy \d copy
trong psql hoặc xem hướng dẫn sử dụng cho copy
lệnh trực tuyến).
Không có cơ sở lập bản đồ nào trong COPY
cho phép bạn chỉ đọc một số cột của CSV đầu vào. Nó thực sự hữu ích, nhưng không ai có thời gian / sở thích / kinh phí để thực hiện nó. Dù sao thì đây thực sự chỉ là một trong nhiều tác vụ chuyển đổi / lọc dữ liệu mà mọi người muốn.
PostgreSQL mong đợi danh sách cột được cung cấp trong COPY
theo cùng một thứ tự, từ trái sang phải, giống như những gì trong tệp CSV và có cùng số lượng mục nhập như tệp CSV có cột. Vì vậy, nếu bạn viết:
COPY con (date,kgs)
thì PostgreSQL sẽ mong đợi một CSV đầu vào có chính xác hai cột . Nó sẽ sử dụng cột csv đầu tiên cho "date"
cột bảng và cột csv thứ hai cho "kgs"
cột bảng. Nó không quan tâm tiêu đề CSV là gì, chúng sẽ bị bỏ qua nếu bạn chỉ định WITH (FORMAT CSV, HEADER ON)
hoặc được coi là các hàng dữ liệu bình thường nếu bạn không chỉ định HEADER
.
PostgreSQL 9.4 thêm FROM PROGRAM
sang COPY
, vì vậy bạn có thể chạy lệnh shell để đọc và lọc tệp. Một tập lệnh Python hoặc Perl đơn giản sẽ thực hiện công việc.
Nếu đó là một tệp nhỏ, chỉ cần mở một bản sao trong bảng tính mà bạn chọn dưới dạng tệp csv, xóa các cột không mong muốn và lưu nó, vì vậy chỉ có date
và kgs
các cột vẫn còn.
Ngoài ra, COPY
vào một bảng dàn dựng có tất cả các cột giống như CSV
, sau đó thực hiện INSERT INTO ... SELECT
để chỉ chuyển dữ liệu mong muốn vào bảng đích thực.