exports.config = { // CREATE INDEX CONCURRENTLY can't be run inside a transaction // If this migration fails in the middle, indexes and constraints will have // to be cleaned up manually. transaction: false, } exports.up = async function (knex) { await knex.raw(` ALTER TABLE chunks ADD CONSTRAINT chunks_start_version_non_negative CHECK (start_version IS NOT NULL AND start_version >= 0) NOT VALID `) await knex.raw(` ALTER TABLE chunks VALIDATE CONSTRAINT chunks_start_version_non_negative `) await knex.raw(` CREATE UNIQUE INDEX CONCURRENTLY index_chunks_on_doc_id_and_start_version ON chunks (doc_id, start_version) `) await knex.raw(` ALTER TABLE chunks ADD UNIQUE USING INDEX index_chunks_on_doc_id_and_start_version `) } exports.down = async function (knex) { await knex.raw(` ALTER TABLE chunks DROP CONSTRAINT IF EXISTS index_chunks_on_doc_id_and_start_version `) await knex.raw(` DROP INDEX IF EXISTS index_chunks_on_doc_id_and_start_version `) await knex.raw(` ALTER TABLE chunks DROP CONSTRAINT IF EXISTS chunks_start_version_non_negative `) }