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
How to Modernize Higher Education Technology Operations with Enteros RevOps Efficiency and Database Analytics
- 15 June 2026
- Database Performance Management
Introduction Higher education institutions are undergoing a significant digital transformation as universities, colleges, online learning providers, and educational technology organizations modernize their operations to support evolving student expectations, hybrid learning environments, and data-driven decision-making. Today’s educational institutions rely on increasingly complex technology ecosystems that support: Student Information Systems (SIS) Learning Management Systems (LMS) Online learning … Continue reading “How to Modernize Higher Education Technology Operations with Enteros RevOps Efficiency and Database Analytics”
The Role of Real-Time SQL Analytics in Reducing Cloud Infrastructure Costs
Cloud infrastructure has transformed how modern enterprises build and scale applications. Organizations now rely heavily on cloud platforms to support digital services, real-time transactions, analytics workloads, and global user demand. While the cloud offers unmatched scalability and flexibility, it also introduces a growing challenge: controlling infrastructure costs without compromising performance. For many enterprises, databases represent … Continue reading “The Role of Real-Time SQL Analytics in Reducing Cloud Infrastructure Costs”
How to Optimize Retail Customer Experiences with Enteros AI SQL Intelligence and Operational Analytics
Introduction Customer experience has become one of the most important competitive differentiators in the retail industry. Whether customers are shopping online, using mobile applications, engaging with loyalty programs, or visiting physical stores, they expect fast, personalized, and seamless interactions across every touchpoint. To meet these expectations, retailers increasingly rely on sophisticated digital ecosystems that include: … Continue reading “How to Optimize Retail Customer Experiences with Enteros AI SQL Intelligence and Operational Analytics”
How AI-Driven Database Observability Improves Multi-Cloud Application Reliability
Modern enterprises increasingly rely on multi-cloud architectures to support scalability, resilience, and global application delivery. By distributing workloads across providers such as Amazon Web Services (AWS), Microsoft Azure, and Google Cloud, organizations gain flexibility and avoid vendor lock-in. However, these benefits come with a major challenge: maintaining consistent application reliability across complex, distributed environments. At … Continue reading “How AI-Driven Database Observability Improves Multi-Cloud Application Reliability”