Skip to content
Discord Get Started

DDL — Data Definition

Data Definition Language statements for creating and managing database objects.

SQL
CREATE TABLE [IF NOT EXISTS] table_name (
column_name type [constraints],
...
[table_constraints]
);
-- Create from query result
CREATE TABLE new_table AS SELECT ... FROM source;
SELECT ... INTO new_table FROM source;

Column constraints: NOT NULL, DEFAULT, PRIMARY KEY, UNIQUE, REFERENCES (foreign key), CHECK

Table constraints: PRIMARY KEY (col, ...), UNIQUE (col, ...), FOREIGN KEY (col) REFERENCES table(col) with ON DELETE/ON UPDATE actions, CHECK (expr)

SERIAL and BIGSERIAL columns are supported for auto-incrementing IDs. Self-referential foreign keys are supported.

Identity columns:

SQL
-- GENERATED ALWAYS AS IDENTITY (database controls the value)
CREATE TABLE t (id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY);
-- GENERATED BY DEFAULT AS IDENTITY (user can override)
CREATE TABLE t (id INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY);
-- With sequence options
CREATE TABLE t (
id INT GENERATED ALWAYS AS IDENTITY (START WITH 100 INCREMENT BY 10)
);

Generated (computed) columns:

SQL
CREATE TABLE products (
price NUMERIC,
tax NUMERIC,
total NUMERIC GENERATED ALWAYS AS (price + tax) STORED
);
SQL
-- B-tree index (default)
CREATE INDEX idx_name ON table (column);
-- Unique index
CREATE UNIQUE INDEX idx_name ON table (column);
-- GIN index (for JSONB, full-text search, arrays)
CREATE INDEX idx_name ON table USING GIN (column);
-- GiST index
CREATE INDEX idx_name ON table USING GIST (column);
-- Expression index
CREATE INDEX idx_name ON table (lower(column));
-- Partial index
CREATE INDEX idx_name ON table (column) WHERE active = true;
-- Non-blocking index creation
CREATE INDEX CONCURRENTLY idx_name ON table (column);

Index methods: btree (default), GIN, GiST. IF NOT EXISTS is supported.

SQL
CREATE VIEW view_name AS SELECT ...;
CREATE OR REPLACE VIEW view_name AS SELECT ...;

CREATE OR REPLACE VIEW cannot drop or rename existing columns; only appending new columns is allowed.

SQL
CREATE MATERIALIZED VIEW mv_name AS SELECT ...;
REFRESH MATERIALIZED VIEW mv_name;
OperationSyntax
Add columnALTER TABLE t ADD COLUMN col type
Drop columnALTER TABLE t DROP COLUMN col
Rename columnALTER TABLE t RENAME COLUMN old TO new
Rename tableALTER TABLE t RENAME TO new_name
Set defaultALTER TABLE t ALTER COLUMN col SET DEFAULT val
Drop defaultALTER TABLE t ALTER COLUMN col DROP DEFAULT
Set not nullALTER TABLE t ALTER COLUMN col SET NOT NULL
Drop not nullALTER TABLE t ALTER COLUMN col DROP NOT NULL
Change typeALTER TABLE t ALTER COLUMN col SET DATA TYPE type [USING expr]
Add constraintALTER TABLE t ADD CONSTRAINT name ...
Drop constraintALTER TABLE t DROP CONSTRAINT name
Rename constraintALTER TABLE t RENAME CONSTRAINT old TO new
SQL
DROP TABLE [IF EXISTS] table_name [CASCADE];
DROP INDEX [IF EXISTS] index_name;
DROP VIEW [IF EXISTS] view_name [CASCADE];
DROP MATERIALIZED VIEW [IF EXISTS] mv_name [CASCADE];
TRUNCATE TABLE table_name;

CASCADE transitively resolves and drops all dependent views and materialized views.

StatementSupported
CREATE SCHEMAYes
CREATE SEQUENCE / DROP SEQUENCEYes
CREATE TYPE (enum, composite) / ALTER TYPE / DROP TYPEYes
CREATE FUNCTION / DROP FUNCTIONYes
CREATE TRIGGER / DROP TRIGGERYes
CREATE COLLATION / DROP COLLATIONYes
CREATE DATABASE / DROP DATABASE / ALTER DATABASEYes
CREATE EXTENSION / DROP EXTENSIONYes
COMMENT ON (table, column, schema, etc.)Yes

Sequence options: START, INCREMENT, MINVALUE, MAXVALUE, CACHE, CYCLE are supported in CREATE SEQUENCE and identity column definitions.