CodeGym /Các khóa học /SQL SELF /Sử dụng COPY để nạp dữ liệu từ server

Sử dụng COPY để nạp dữ liệu từ server

SQL SELF
Mức độ, Bài học
Có sẵn

Khi dữ liệu của bạn đã nằm trên server, bạn có thể dùng lệnh COPY để nạp nó vào bảng PostgreSQL. Cách này cực kỳ hữu ích nếu bạn làm việc với dữ liệu lớn hoặc server PostgreSQL của bạn chạy trên máy riêng biệt.

Lệnh COPY chạy phía server đặc biệt tiện lợi trong các dự án thực tế. Đầu tiên, nó chạy nhanh hơn nhiều vì file đã ở trên server, không cần truyền qua mạng. Điều này cũng làm quá trình an toàn hơn: không cần copy dữ liệu từ máy cá nhân, giảm rủi ro rò rỉ. Ngoài ra, việc nạp dữ liệu có thể dễ dàng tích hợp vào script server tự động hoặc các dịch vụ chạy nền — ví dụ, khi cập nhật bảng phân tích định kỳ.

Cú pháp lệnh COPY

Lệnh COPY khá đơn giản, nhưng có vài điểm quan trọng cần chú ý:

COPY table_name
FROM '/path/to/file.csv'
WITH (FORMAT CSV, HEADER TRUE);
  • table_name — tên bảng bạn muốn nạp dữ liệu vào.
  • /path/to/file.csv — đường dẫn đầy đủ tới file trên server.
  • Tuỳ chọn WITH cho phép bạn chỉ định định dạng file, có header không, ký tự phân cách và nhiều thứ khác.

Ví dụ sử dụng lệnh COPY

Cùng xem một ví dụ nhỏ nhé. Giả sử bạn cần nạp file CSV chứa dữ liệu sinh viên vào database PostgreSQL. File nằm trên server tại /var/lib/postgresql/data/students.csv.

Bước 1. Tạo bảng dữ liệu

Đầu tiên, đảm bảo database đã có bảng để nạp dữ liệu vào:

CREATE TABLE students (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    email TEXT UNIQUE NOT NULL,
    registration_date DATE
);

Bảng này sẽ lưu thông tin sinh viên: tên, email và ngày đăng ký của họ.

Bước 2. File CSV

Đây là ví dụ file /var/lib/postgresql/data/students.csv có thể trông như thế nào:

id,name,email,registration_date
1,Alex Lin,alex.lin@example.com,2023-09-01
2,Maria Chi,maria.chi@example.com,2023-09-02
3,Peter Ming,peter.ming@example.com,2023-09-02

Bước 3. Lệnh COPY

Bây giờ bạn có thể dùng COPY để nạp dữ liệu từ file vào bảng:

COPY students
FROM '/var/lib/postgresql/data/students.csv'
WITH (FORMAT CSV, HEADER TRUE);

Ở đây:

  • FORMAT CSV báo cho PostgreSQL biết file là định dạng CSV.
  • HEADER TRUE nghĩa là dòng đầu tiên của file chứa tên cột.

Sau khi chạy lệnh này, dữ liệu trong file sẽ được nạp vào bảng students.

Kiểm tra kết quả

Sau khi nạp dữ liệu, hãy kiểm tra xem mọi thứ đã ổn chưa:

SELECT * FROM students;

Bạn sẽ thấy các dòng từ file đã được nạp vào bảng:

id name email registration_date
1 Alex Lin alex.lin@example.com 2023-09-01
2 Maria Chi maria.chi@example.com 2023-09-02
3 Peter Ming peter.ming@example.com 2023-09-02

Cấu hình quyền truy cập

PostgreSQL cần có quyền truy cập file để dùng lệnh COPY. Nếu quyền không đúng, bạn sẽ gặp lỗi. Ví dụ:

ERROR:  could not open file "/var/lib/postgresql/data/students.csv" for reading: Permission denied

Để tránh lỗi này, hãy đảm bảo các điều sau:

  1. File phải đọc được bởi user PostgreSQL. Thường là user postgres.
  2. Kiểm tra quyền truy cập file và thư mục chứa nó:
ls -l /var/lib/postgresql/data/students.csv

Nếu quyền chưa đủ, bạn có thể chỉnh lại:

chmod 644 /var/lib/postgresql/data/students.csv
chown postgres:postgres /var/lib/postgresql/data/students.csv

Ở đây nói về Linux nhé. Cấu hình quyền trên Windows thường do admin Windows làm và nằm ngoài phạm vi khoá học này.

Giới hạn của lệnh COPY

Làm việc với COPY có vài điểm cần lưu ý:

Đường dẫn file: hãy dùng đường dẫn tuyệt đối, vì PostgreSQL có thể không nhận ra đường dẫn tương đối.

Bảng mã file: nếu file CSV dùng encoding khác database (ví dụ Windows-1251 thay vì UTF-8), bạn cần chỉ rõ encoding:

COPY students
FROM '/var/lib/postgresql/data/students.csv'
WITH (FORMAT CSV, ENCODING 'WIN1251', HEADER TRUE);

Lỗi cấu trúc file: nếu cấu trúc file không khớp bảng hoặc dữ liệu sai (ví dụ text nạp vào trường số), quá trình nạp sẽ lỗi. Hãy kiểm tra dữ liệu trước khi nạp nhé!

Ứng dụng thực tế

Dùng COPY để nạp dữ liệu từ server có rất nhiều ứng dụng:

  • Di chuyển dữ liệu: bạn có thể chuyển lượng lớn dữ liệu giữa các server hoặc database.
  • Tích hợp với hệ thống ngoài: nhiều hệ thống xuất dữ liệu ra file CSV. COPY giúp nạp nhanh dữ liệu này vào PostgreSQL.
  • Chuẩn bị báo cáo phân tích: tự động nạp dữ liệu từ server giúp tăng tốc quá trình phân tích dữ liệu lớn.

Lỗi thường gặp và cách xử lý

Khi làm với COPY, bạn có thể gặp một số lỗi sau:

Vấn đề: File không truy cập được

Thông báo lỗi: could not open file for reading: Permission denied.

Cách xử lý: kiểm tra file có truy cập được bởi user PostgreSQL (postgres) và kiểm tra quyền truy cập.

Vấn đề: Định dạng file sai

Thông báo lỗi: malformed CSV line.

Cách xử lý: kiểm tra file có dòng trống, lỗi dữ liệu hoặc ký tự lạ không. Đảm bảo ký tự phân cách đúng.

Vấn đề: Cấu trúc dữ liệu không khớp

Thông báo lỗi: ERROR: invalid input syntax for type integer.

Cách xử lý: đảm bảo các cột trong bảng khớp với cấu trúc dữ liệu trong file. Ví dụ, dữ liệu số phải nạp vào cột số, ngày tháng vào cột kiểu DATE.

Giờ thì bạn đã có đủ kiến thức để dùng COPY nạp dữ liệu từ server rồi đó. Áp dụng ngay vào dự án của bạn để tiết kiệm thời gian và tăng hiệu suất làm việc với database nhé!

2
Nhiệm vụ
SQL SELF, mức độ, bài học
Đã khóa
Tạo bảng và tải dữ liệu từ server
Tạo bảng và tải dữ liệu từ server
1
Khảo sát/đố vui
, cấp độ , bài học
Không có sẵn
Chèn dữ liệu từ CSV
Chèn dữ liệu từ CSV
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION