> This page location: Database Constraints > DEFAULT Constraint
> Full Neon documentation index: https://neon.com/docs/llms.txt

# PostgreSQL DEFAULT Value

**Summary**: in this tutorial, you will learn how to assign a default value to a column using the PostgreSQL DEFAULT constraint.

## Defining the DEFAULT value for a column of a new table

When [creating a table](https://neon.com/postgresql/postgresql-tutorial/postgresql-create-table), you can define a default value for a column in the table using the `DEFAULT` constraint. Here's the basic syntax:

```sql
CREATE TABLE table_name(
    column1 type,
    column2 type DEFAULT default_value,
    column3 type,
    ...
);
```

In this syntax, the `column2` will receive the `default_value` when you [insert a new row](https://neon.com/postgresql/postgresql-tutorial/postgresql-insert) into the `table_name` without specifying a value for the column.

If you don't specify the `DEFAULT` constraint for the column, its default value is `NULL`:

```sql
CREATE TABLE table_name(
    column1 type,
    column2 type,
    column3 type,
    ...
);
```

This often makes sense because `NULL` represents unknown data.

The default value can be a literal value such as a number, a string, a JSON object, etc. Additionally, it can be an expression that will be evaluated when the default value is inserted into the table:

```sql
CREATE TABLE table_name(
    column1 type,
    column2 type DEFAULT expression,
    column3 type,
    ...
);
```

When inserting a new row into a table, you can ignore the column that has a default value. In this case, PostgreSQL will use the default value for the insertion:

```sql
INSERT INTO table_name(column1, column3)
VALUES(value1, value2);
```

If you specify the column with a default constraint in the `INSERT` statement and want to use the default value for the insertion, you can use the `DEFAULT` keyword as follows:

```sql
INSERT INTO table_name(column1, column2, column3)
VALUES(value1,DEFAULT,value2);
```

## Defining the DEFAULT value for a column of an existing table

If you want to specify a default value for a column of an existing table, you can use the `ALTER TABLE` statement:

```sql
ALTER TABLE table_name
ALTER COLUMN column2
SET DEFAULT default_value;
```

In this syntax:

- First, specify the table name in the `ALTER TABLE` clause (`table_name`).
- Second, provide the name of the column that you want to assign a default value in the `ALTER COLUMN` clause.
- Third, specify a default value for the column in the `SET DEFAULT` clause.

## Removing the DEFAULT value from a column

To drop a default value later, you can also use the `ALTER TABLE ... ALTER COLUMN ... DROP DEFAULT` statement:

```sql
ALTER TABLE table_name
ALTER COLUMN column2
DROP DEFAULT;
```

In this syntax:

- First, specify the table name in the `ALTER TABLE` clause.
- Second, provide the name of the column that you want to remove the default value in the `ALTER COLUMN` clause.
- Third, use the `DROP DEFAULT` to remove the default value from the column.

## PostgreSQL default value examples

Let's take some examples of using the `DEFAULT` constraint to specify a default value for a column.

### 1) Basic PostgreSQL default value examples

First, [create a new table](https://neon.com/postgresql/postgresql-tutorial/postgresql-create-table) called `products` to store product data:

```sql
CREATE TABLE products(
   id SERIAL PRIMARY KEY,
   name VARCHAR(255) NOT NULL,
   price DECIMAL(19,2) NOT NULL DEFAULT 0
);
```

Second, insert a row into the `products` table:

```sql
INSERT INTO products(name)
VALUES('Laptop')
RETURNING *;
```

Output:

```text
 id |  name  | price
----+--------+-------
  1 | Laptop |  0.00
(1 row)
```

In this example, we don't specify a value for the `price` column in the `INSERT` statement; therefore, PostgreSQL uses the default value `0.00` for the `price` column.

Third, insert one more row into the `products` table:

```sql
INSERT INTO products(name, price)
VALUES
   ('Smartphone', DEFAULT)
RETURNING *;
```

Output:

```text
 id |    name    | price
----+------------+-------
  2 | Smartphone |  0.00
(1 row)
```

In this example, we use the `DEFAULT` keyword as the value for the `price` column in the `INSERT` statement, PostgreSQL uses the default value as `0.00` for the column.

Finally, insert a new row into the `products` table:

```sql
INSERT INTO products(name, price)
VALUES
   ('Tablet', 699.99)
RETURNING *;
```

Output:

```text
 id |  name  | price
----+--------+--------
  3 | Tablet | 699.99
(1 row)
```

In this example, we explicitly specify a value for the price column, and PostgreSQL uses the provided value instead of the default value for the insertion.

### 2) Using DEFAULT constraint with TIMESTAMP columns

First, create a new table called `logs` that stores the log messages:

```sql
CREATE TABLE logs(
   id SERIAL PRIMARY KEY,
   message TEXT NOT NULL,
   created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```

The `created_at` column uses the current timestamp returned by the `CURRENT_TIMESTAMP` function as the default value.

Second, insert rows into the `logs` table:

```sql
INSERT INTO logs(message)
VALUES('Started the server')
RETURNING *;
```

Output:

```text
 id |      message       |         created_at
----+--------------------+----------------------------
  1 | Started the server | 2024-03-15 10:22:48.680802
(1 row)
```

In the `INSERT` statement, we don't specify the value for the `created_at` column, PostgreSQL uses the current timestamp for the insertion.

### 3) Using DEFAULT constraint with JSONB type

First, create a table called `settings` to store configuration data:

```sql
CREATE TABLE settings(
   id SERIAL PRIMARY KEY,
   name VARCHAR(50) NOT NULL,
   configuration JSONB DEFAULT '{}'
);
```

The `configuration` column has the [JSONB](https://neon.com/postgresql/postgresql-tutorial/postgresql-json) type with the default value as an empty JSON object.

Second, insert a new row into the `settings` table:

```sql
INSERT INTO settings(name)
VALUES('global')
RETURNING *;
```

Output:

```text
 id |  name  | configuration
----+--------+---------------
  1 | global | {}
(1 row)
```

Since we don't specify a value for the `configuration` column, PostgreSQL uses the empty JSON object `{}` for the insertion.

To remove the default JSONB value from the `configuration` column of the `settings` table, you can use the following `ALTER TABLE` statement:

```sql
ALTER TABLE settings
ALTER COLUMN configuration
DROP DEFAULT;
```

## Summary

- Use the `DEFAULT` constraint to define a default value for a table column.
- Use the `DEFAULT` keyword to explicitly use the default value specified in the `DEFAULT` constraint in the `INSERT` statement.

---

## Related docs (Database Constraints)

- [Primary Key](https://neon.com/postgresql/postgresql-tutorial/postgresql-primary-key)
- [Foreign Key](https://neon.com/postgresql/postgresql-tutorial/postgresql-foreign-key)
- [CHECK Constraint](https://neon.com/postgresql/postgresql-tutorial/postgresql-check-constraint)
- [UNIQUE Constraint](https://neon.com/postgresql/postgresql-tutorial/postgresql-unique-constraint)
- [NOT NULL Constraint](https://neon.com/postgresql/postgresql-tutorial/postgresql-not-null-constraint)
