Your `CHECK` constraint can be much simpler: ALTER TABLE billables ADD CONSTRAINT cc_at_least_one_mapping_needed_billables CHECK (qb_id IS NOT NULL OR xero_id IS NOT NULL OR freshbooks_id IS NOT NULL OR unleashed_id IS NOT NULL OR csv_data IS NOT NULL OR myob_id IS NOT NULL) NOT VALID; Or even just: CONSTRAINT cc_at_least_one_mapping_needed_billables CHECK (NOT (qb_id,xero_id,freshbooks_id,unleashed_id,csv_data,myob_id) IS NULL) NOT VALID; Why does that work? - [NOT NULL constraint over a set of columns][1] - [Why is IS NOT NULL false when checking a row type?][2] I already added the [**`NOT VALID`**][3] clause that [@a_horse mentioned][4]. This way the constraint only applies to newly added rows. You also have to consider possible dump/restore cycles. Details: - http://dba.stackexchange.com/questions/75613/disable-all-constraints-and-table-checks-while-restoring-a-dump/75635#75635 - http://dba.stackexchange.com/questions/52517/best-way-to-populate-a-new-column-in-a-large-table/52531#52531 And you can do it **all in a single command**, which is fastest and prevents possible concurrent transactions from doing anything wrong: ALTER TABLE integrations.billables DROP CONSTRAINT IF EXISTS cc_at_least_one_mapping_needed_billables , ADD COLUMN myob_id varchar(255) , ADD CONSTRAINT cc_at_least_one_mapping_needed_billables CHECK (NOT (qb_id,xero_id, freshbooks_id,unleashed_id, csv_data, myob_id) IS NULL) NOT VALID; [**SQL Fiddle.**][5] Aside 1: If you already had the `CHECK` constraint on the same set of columns, just without the new `myob_id`, then there wouldn't be a problem, since every existing row would pass the new `CHECK` constraint with `myob_id` as well. Aside 2: In some RDBMS it makes sense to use `varchar(255)` to optimize performance. This is irrelevant to Postgres and 255 as length modifier only makes sense if you actually need to restrict the length to a maximum of 255: - [Do fixed-width rows improve PostgreSQL read performance?][6] - [Any downsides of using data type “text” for storing strings?][7] [1]: http://stackoverflow.com/a/21026085/939860 [2]: http://stackoverflow.com/a/27353191/939860 [3]: http://www.postgresql.org/docs/current/interactive/sql-altertable.html [4]: http://dba.stackexchange.com/a/128127/3684 [5]: http://sqlfiddle.com/#!15/1490b/1 [6]: http://dba.stackexchange.com/a/113162/3684 [7]: http://stackoverflow.com/a/20334221/939860