changing-column-type

problem#

Changing a column type requires an ACCESS EXCLUSIVE lock on the table which blocks reads and writes while the table is rewritten.

Changing the type of the column may also break other clients reading from the table.

https://www.postgresql.org/docs/current/sql-altertable.html#SQL-ALTERTABLE-NOTES

solution#

Some "binary coercible" types can be converted without a table rewrite.

VARCHAR can safely be converted to TEXT and shorter VARCHAR(5) can be converted to longer VARCHAR(10) because they have the same binary representation on disk.

An INT (4 bytes wide) cannot be converted to a BIGINT (8 bytes wide) without rewriting the table.

convert an INT column to a BIGINT column#

Consider a user_email table with a column user_id that we want to convert from INT to BIGINT.

The general process is to add a new column, new_user_id. Dual write with triggers. Backfill.

See "Postgres Tips: How to convert 2 Billion Rows to Bigint with Citus" for a detailed example.

This section may be expanded upon in the future.

convert an INT primary key to BIGINT#

It's a complicated, multi-step process to convert columns that are primary keys or columns that have foreign key relations.

This section may be expanded upon in the future.