\copy
có thể sử dụng một bảng tạm thời.
Đầu tiên tôi đã thử nghiệm và xác nhận điều này với phiên bản 9.0 tại dòng lệnh.
Sau đó, tôi đã tạo một tệp với lệnh meta SQL và psql \copy
bằng nhiều bảng tạm thời. Điều đó cũng làm việc cho tôi.
CREATE TEMP TABLE tmp as SELECT * FROM tbl;
\copy (SELECT * FROM tmp JOIN tbl USING (id)) TO '/var/lib/postgres/test1.csv';
Gọi:
psql -p5432 mydb -f test.sql
Lưu ý dấu chấm phẩy chấm dứt, là tùy chọn ở cuối tệp (chấm dứt hoàn toàn), nhưng được yêu cầu sau bất kỳ câu lệnh SQL nào khác và sau câu lệnh cuối cùng nếu được thực thi trong psql tương tác.
Thông thường , các lệnh meta psql không thể được trộn lẫn với SQL trên cùng một dòng trong một tệp được thực thi mỗi psql -f
. Tôi trích dẫn hướng dẫn trên psql :
Phân tích cú pháp cho các đối số dừng ở cuối dòng hoặc khi tìm thấy dấu gạch chéo ngược không trích dẫn khác. Dấu gạch chéo ngược không trích dẫn được lấy làm khởi đầu của một lệnh meta mới. Chuỗi đặc biệt \\
(hai dấu gạch chéo ngược) đánh dấu sự kết thúc của các đối số và tiếp tục phân tích cú pháp các lệnh SQL, nếu có. Bằng cách đó, các lệnh SQL và psql có thể được trộn tự do trên một dòng. Nhưng trong mọi trường hợp, các đối số của một lệnh meta không thể tiếp tục vượt quá cuối dòng.
Quy tắc khác nhau áp dụng sau \copy
, mặc dù. Về cơ bản, psql tự động chuyển về chế độ SQL sau khi \copy
Xem:
Nhưng bạn đã viết bạn có tất cả các lệnh trên các dòng riêng biệt. Vì vậy, đó không thể là lời giải thích trong trường hợp của bạn.
Bỏ qua một bên, bạn đã cân nhắc sử dụng COPY
( lệnh SQL ) thay vì \copy
( lệnh meta psql ) chưa?
Tất nhiên, tệp mục tiêu sẽ phải là cục bộ cho máy chủ chứ không phải máy khách trong trường hợp này. Và đặc quyền tập tin khác nhau áp dụng. Hướng dẫn sử dụng :
Các tệp có tên trong một COPY
lệnh được đọc hoặc ghi trực tiếp bởi máy chủ, không phải bởi ứng dụng khách. Do đó, chúng phải nằm trên hoặc có thể truy cập được vào máy chủ cơ sở dữ liệu, không phải máy khách. Chúng phải có thể truy cập và có thể đọc hoặc ghi được bởi người dùng PostgreSQL (ID người dùng mà máy chủ chạy dưới dạng), chứ không phải máy khách.