The COPY command helps you quickly move lots of data into or out of a database table. It is faster than inserting rows one by one.
COPY command for bulk data loading in PostgreSQL
COPY table_name [ ( column_list ) ] FROM 'file_path' [ WITH ( option [, ...] ) ]; COPY table_name [ ( column_list ) ] TO 'file_path' [ WITH ( option [, ...] ) ];
The COPY command can load data FROM a file into a table or export data TO a file from a table.
Options like FORMAT (csv), DELIMITER, HEADER help control the file format.
customers table.COPY customers FROM '/tmp/customers.csv' WITH (FORMAT csv, HEADER true);
orders table to a CSV file using | as the delimiter.COPY orders TO '/tmp/orders_export.csv' WITH (FORMAT csv, DELIMITER '|');
products table.COPY products (id, name, price) FROM '/tmp/products.csv' WITH (FORMAT csv);
This example creates a simple employees table, loads data from a CSV file with a header, then shows all rows.
CREATE TABLE employees ( id SERIAL PRIMARY KEY, name TEXT, department TEXT ); COPY employees (name, department) FROM '/tmp/employees.csv' WITH (FORMAT csv, HEADER true); SELECT * FROM employees;
The file path must be accessible by the PostgreSQL server, not your local machine if using a client.
Use psql client's \copy command to load files from your local machine.
Be careful with file permissions and data formats to avoid errors.
The COPY command is a fast way to load or export large amounts of data.
It supports CSV and other formats with options for headers and delimiters.
Always check file paths and permissions before running COPY.
Practice
COPY command in PostgreSQL?Solution
Step 1: Understand the function of COPY
The COPY command is designed to transfer data efficiently between a file and a PostgreSQL table.Step 2: Compare with other commands
Unlike CREATE, UPDATE, or DELETE, COPY focuses on bulk data loading or exporting, not modifying table structure or individual rows.Final Answer:
To quickly load or export large amounts of data between a file and a table -> Option CQuick Check:
COPY = bulk data transfer [OK]
- Confusing COPY with CREATE TABLE
- Thinking COPY updates rows
- Assuming COPY deletes data
employees?Solution
Step 1: Identify direction of COPY
To load data into a table, use COPY ... FROM. COPY employees FROM '/path/to/file.csv' WITH CSV HEADER; and C use FROM, B uses TO which exports data.Step 2: Check format and options
COPY employees FROM '/path/to/file.csv' WITH CSV HEADER; uses WITH CSV HEADER which is correct for CSV files with headers. COPY employees FROM '/path/to/file.csv' DELIMITER ';'; uses DELIMITER ';' but no CSV keyword, which is less clear. COPY employees FROM '/path/to/file.csv' FORMAT JSON; uses FORMAT JSON which is invalid for COPY.Final Answer:
COPY employees FROM '/path/to/file.csv' WITH CSV HEADER; -> Option BQuick Check:
Load CSV with header = COPY ... FROM ... WITH CSV HEADER [OK]
- Using COPY ... TO instead of FROM to load data
- Missing WITH CSV HEADER for CSV files with headers
- Using wrong format like JSON in COPY
products(id INT, name TEXT, price NUMERIC), what will be the result of this command?COPY products FROM '/tmp/products.csv' WITH CSV HEADER;
Assuming
/tmp/products.csv contains:id,name,price 1,Pen,1.20 2,Notebook,2.50 3,Eraser,0.80
Solution
Step 1: Understand COPY with CSV HEADER
The HEADER option tells COPY to skip the first line (column names) and load the rest as data rows.Step 2: Check data types and rows
The CSV data matches the table columns and types correctly: id as int, name as text, price as numeric. All 3 data rows will be inserted.Final Answer:
3 rows inserted into products table -> Option DQuick Check:
CSV HEADER skips first line, 3 data lines inserted [OK]
- Thinking HEADER skips all rows
- Assuming numeric columns reject string input
- Confusing COPY direction or syntax
COPY customers FROM '/data/customers.csv' WITH CSV;
But get an error:
ERROR: could not open file "/data/customers.csv": Permission deniedWhat is the most likely cause?
Solution
Step 1: Analyze the error message
The error says "Permission denied" when opening the file, indicating a file access issue.Step 2: Understand file permissions in COPY
PostgreSQL server must have OS-level read permission on the file. If it lacks permission, this error occurs.Final Answer:
The PostgreSQL server process lacks permission to read the file -> Option AQuick Check:
Permission denied = file access issue [OK]
- Assuming syntax error causes permission denied
- Thinking CSV format causes file access error
- Ignoring file permissions on server
age column is empty or NULL. Which approach using COPY and PostgreSQL features is best?Solution
Step 1: Understand COPY limitations
COPY does not support filtering rows or WHERE clauses during import.Step 2: Use staging table for filtering
Load all data into a temporary or staging table, then run an INSERT INTO ... SELECT ... WHERE age IS NOT NULL to filter rows.Step 3: Consider manual CSV editing
While manual editing works, it is inefficient and error-prone for large files.Final Answer:
Use COPY to load all data into a staging table, then insert filtered rows into the target table -> Option AQuick Check:
COPY can't filter; use staging table + filter [OK]
- Expecting COPY to filter rows directly
- Looking for non-existent COPY options to ignore NULLs
- Relying on manual CSV edits for large data
Ready to prove it?
Pass the test and this pattern moves unknown
