Preamble
PostgreSQL INSERT statement is used to insert one or more records into a table in PostgreSQL.
The syntax for the INSERT statement
The syntax for PostgreSQL INSERT statement when inserting a record(s) using VALUES keyword
INSERT INTO table
(column1, column2,... )
VALUES
(expression1 | DEFAULT, expression2 | DEFAULT,... ),
(expression1 | DEFAULT, expression2 | DEFAULT,... ),
…;
Or:
The syntax for INSERT statement when inserting a single record using the DEFAULT VALUES keyword in PostgreSQL
INSERT INTO table
(column1, column2,... )
DEFAULT VALUES;
Or:
The syntax for INSERT statement when inserting multiple records using a subquery in PostgreSQL
INSERT INTO table
(column1, column2,... )
SELECT expression1, expression2,...
FROM source_table
[WHERE conditions];
Parameters and arguments of the statement
- table – A table for inserting records.
- column1, column2 – Columns in the table for inserting values.
- expression1 | DEFAULT, expression2 | DEFAULT – Used in the first syntax. These values are assigned to the columns in the table. If expression1 is specified then column1 will be assigned the value expression1, column2 will be assigned the value expression2, and so on. If DEFAULT is specified then the corresponding column will be filled with the default value.
- DEFAULT VALUES – Used in the second syntax. All columns will be filled with their default values.
- source_table – To be used in the third syntax. This is the source table when inserting data from another table.
- WHERE conditions – Optional. Used in the third syntax. These are the conditions that must be met to insert the records.
Note:
- When inserting records into a table using PostgreSQL, the INSERT operator must specify the value for each column NOT NULL.
- You can omit a column in PostgreSQL operator INSERT if the column allows NULL values.
Example using VALUES keyword
The easiest way to create a PostgreSQL INSERT query to get a list of values using the VALUES keyword.
For example:
INSERT INTO contacts
(contact_id, last_name, first_name, country)
VALUES
(250, 'Abramova', 'Irina', DEFAULT);
This PostgreSQL statement INSERT will cause a single record to be inserted into the contacts table. This new record will have contact_id 250, last_name ‘Abramova’, first_name ‘Irina’, and any default value for the country field.
You can use the above syntax to insert more than one record at a time.
For example:
INSERT INTO contacts
(contact_id, last_name, first_name, country)
VALUES
(250, 'Abramova', 'Irina', DEFAULT),
(251, 'Arbatova', 'Vitalina', 'Russia');
This PostgreSQL operator INSERT will insert two records into the contacts table. The first record will have contact_id 250, last_name ‘Abramova’, first_name ‘Irina’ and any default value for the country field . The second entry will have contact_id 251, last_name ‘Arbatova’, first_name ‘Vitalina’ and country ‘Russia’.
This will be equivalent to the next two INSERT operators:
INSERT INTO contacts
(contact_id, last_name, first_name, country)
VALUES
(250, 'Abramova', 'Irina', DEFAULT);
INSERT INTO contacts
(contact_id, last_name, first_name, country)
VALUES
(251, 'Arbatova', 'Vitalina', 'Russia');
Example using the DEFAULT VALUES keyword
In PostgreSQL, you can also insert a record into a table using DEFAULT VALUES syntax.
For example:
INSERT INTO contacts
(contact_id, last_name, first_name, country)
DEFAULT VALUES;
This PostgreSQL statement INSERT will cause one record to be inserted into the contacts table. This new record will be created with default values for the fields contact_id, last_name, first_name, and country.
Example using a subquery
You can also create more complex PostgreSQL statements INSERT using subqueries.
For example:
INSERT INTO contacts
(last_name, first_name)
SELECT last_name, first_name
FROM customers
WHERE customer_id > 3500;
By placing the SELECT operator in the INSERT operator, you can quickly perform several insertion operations.
With this type of insertion, you can check the number of lines to be inserted. You can define the number of rows to be inserted by executing the next PostgreSQL SELECT operator before inserting it.
SELECT count(*)
FROM customers
WHERE customer_id > 3500;
PostgreSQL: Insert Into | Course
About Enteros
Enteros offers a patented database performance management SaaS platform. It proactively identifies root causes of complex business-impacting database scalability and performance issues across a growing number of clouds, RDBMS, NoSQL, and machine learning database platforms.
The views expressed on this blog are those of the author and do not necessarily reflect the opinions of Enteros Inc. This blog may contain links to the content of third-party sites. By providing such links, Enteros Inc. does not adopt, guarantee, approve, or endorse the information, views, or products available on such sites.
Are you interested in writing for Enteros’ Blog? Please send us a pitch!
RELATED POSTS
Why BFSI Leaders Are Turning to Enteros for Database Optimization, AI Ops, and Cloud FinOps Excellence
- 16 April 2026
- Database Performance Management
Introduction The Banking, Financial Services, and Insurance (BFSI) sector is undergoing a massive digital transformation. With the rise of digital banking, real-time payments, fraud detection systems, and AI-driven financial services, organizations are becoming increasingly dependent on high-performance data infrastructure. From managing millions of transactions per second to enabling real-time risk analysis and personalized customer experiences, … Continue reading “Why BFSI Leaders Are Turning to Enteros for Database Optimization, AI Ops, and Cloud FinOps Excellence”
How to Optimize Telecom Sector Growth with Enteros AIOps Platform, Resource Metadata, Hierarchy Metadata, Spot Instances, and RevOps Efficiency
Introduction The telecom sector is at the center of global digital transformation, enabling connectivity for billions of users, businesses, and emerging technologies like IoT, 5G, and edge computing. As demand for high-speed, reliable communication services continues to rise, telecom providers are under immense pressure to scale operations efficiently while maintaining performance and controlling costs. However, … Continue reading “How to Optimize Telecom Sector Growth with Enteros AIOps Platform, Resource Metadata, Hierarchy Metadata, Spot Instances, and RevOps Efficiency”
Who Should Adopt Enteros for Retail Growth Management with AI SQL and Cloud FinOps Efficiency
Introduction The retail sector is evolving at an unprecedented pace, driven by digital transformation, omnichannel experiences, and data-driven decision-making. From global eCommerce giants to mid-sized retail chains, businesses are increasingly relying on cloud infrastructure, databases, and analytics platforms to fuel growth. However, this rapid expansion introduces a fundamental challenge:how to scale efficiently while maintaining performance, … Continue reading “Who Should Adopt Enteros for Retail Growth Management with AI SQL and Cloud FinOps Efficiency”
How to Optimize Technology Sector Growth with Enteros Database Management Platform, Cloud FinOps, and RevOps Efficiency
Introduction The technology sector is at the forefront of innovation, powering digital transformation across industries. From SaaS platforms and cloud-native applications to AI-driven solutions, technology companies are scaling rapidly to meet growing global demand. However, this rapid expansion introduces a critical challenge:how to sustain growth while maintaining high-performance systems, controlling cloud costs, and aligning operations … Continue reading “How to Optimize Technology Sector Growth with Enteros Database Management Platform, Cloud FinOps, and RevOps Efficiency”