When you create a table and you realize that you made a mistake, or
the requirements of the application changed, then you can drop the
table and create it again. But this is not a convenient option if
the table is already filled with data, or if the table is
referenced by other database objects (for instance a foreign key
constraint). Therefore PostgreSQL
provides a family of commands to make modifications on existing
tables.
You can
Add columns,
Remove columns,
Add constraints,
Remove constraints,
Change default values,
Rename columns,
Rename tables.
All these actions are performed using the ALTER
TABLE command.
To add a column, use this command:
ALTER TABLE products ADD COLUMN description text;
The new column will initially be filled with null values in the
existing rows of the table.
You can also define a constraint on the column at the same time,
using the usual syntax:
ALTER TABLE products ADD COLUMN description text CHECK (description <> '');
A new column cannot have a not-null constraint since the column
initially has to contain null values. But you can add a not-null
constraint later. Also, you cannot define a default value on a
new column. According to the SQL standard, this would have to
fill the new columns in the existing rows with the default value,
which is not implemented yet. But you can adjust the column
default later on.
To remove a column, use this command:
ALTER TABLE products DROP COLUMN description;
To add a constraint, the table constraint syntax is used. For example:
ALTER TABLE products ADD CHECK (name <> '');
ALTER TABLE products ADD CONSTRAINT some_name UNIQUE (product_no);
ALTER TABLE products ADD FOREIGN KEY (product_group_id) REFERENCES product_groups;
To add a not-null constraint, which cannot be written as a table
constraint, use this syntax:
ALTER TABLE products ALTER COLUMN product_no SET NOT NULL;
The constraint will be checked immediately, so the table data must
satisfy the constraint before it can be added.
To remove a constraint you need to know its name. If you gave it
a name then that's easy. Otherwise the system assigned a
generated name, which you need to find out. The
psql command \d
tablename can be helpful
here; other interfaces might also provide a way to inspect table
details. Then the command is:
ALTER TABLE products DROP CONSTRAINT some_name;
This works the same for all constraint types except not-null
constraints. To drop a not null constraint use
ALTER TABLE products ALTER COLUMN product_no DROP NOT NULL;
(Recall that not-null constraints do not have names.)
To set a new default for a column, use a command like this:
ALTER TABLE products ALTER COLUMN price SET DEFAULT 7.77;
To remove any default value, use
ALTER TABLE products ALTER COLUMN price DROP DEFAULT;
This is equivalent to setting the default to null, at least in
PostgreSQL. As a consequence, it is not an error to drop a
default where one hadn't been defined, because the default is
implicitly the null value.
To rename a column:
ALTER TABLE products RENAME COLUMN product_no TO product_number;
To rename a table:
ALTER TABLE products RENAME TO items;