Как правильно добавить первичный ключ в журнал изменений базы данных (PostgreSQL) для Liquibase?

Я пытаюсь перенести базу данных со старого PostgreSQL (9.3) на новый PostgreSQL (9.5, 9.6) от Bucardo.

Bucardo использовал первичный ключ для миграции.

У меня есть много баз данных с public.databasechangelog без первичного ключа. Как правильно добавить первичный ключ в журнал изменений базы данных (PostgreSQL) для Liquibase?

Обновить ответ: я могу добавить первичный ключ с помощью SQL, но может быть в Liquibase есть настройка для добавления первичного ключа в XML?

Безопасно добавлен первичный ключ с помощью SQL в public.databasechangelog?


person Anton Patsev    schedule 15.05.2017    source источник
comment
Liquibase намеренно не использует первичный ключ для этой таблицы. Но пограничный случай (о котором упоминается в ошибке), похоже, не применим к PostgreSQL (если у вас нет действительно больших идентификаторов миграции, т. е. больше 1 ГБ).   -  person pozs    schedule 15.05.2017
comment
@pozs: id ограничен 255 символами. Общая макс. размер этих трех столбцов составляет 765 символов - то, что современная СУБД должна иметь возможность индексировать. Отсутствие PK действительно вызвано ограничениями некоторых СУБД: forum.liquibase.org/topic/ (более старые версии Liquibase действительно имели первичный ключ в этой таблице)   -  person a_horse_with_no_name    schedule 15.05.2017
comment
@a_horse_with_no_name а, понятно. Тогда это действительно никогда не вызовет проблем с PostgreSQL.   -  person pozs    schedule 15.05.2017
comment
Но почему вы хотите использовать столбец 255 varchar в качестве первичного ключа? А иметь составной ключ из трех таких младенцев очень близко к безумию, ИМХО.   -  person joop    schedule 15.05.2017
comment
@joop: почему это должно быть безумием, если требуется, чтобы комбинация этих трех значений была уникальной?   -  person a_horse_with_no_name    schedule 15.05.2017
comment
Потому что эти три столбца кажутся FK для domain-tables. Их можно заменить суррогатными ключами (сериями), что займет меньше места (и времени)   -  person joop    schedule 15.05.2017
comment
@joop: они ни к чему не являются внешними ключами. Они однозначно идентифицируют один набор изменений в Liquibase, и каждый набор изменений представляет собой одну строку в этой таблице. Имеет смысл определить их как уникальные в этой таблице.   -  person a_horse_with_no_name    schedule 15.05.2017


Ответы (2)


Разработчики Liquibase решили удалить первичный ключ в этой таблице, потому что, по-видимому, некоторые СУБД имеют проблемы с созданием индекса для этих трех столбцов из-за ограничений на максимальный размер записи индекса.

См., например. это обсуждение: http://forum.liquibase.org/topic/why-does-databasechangelog-not-have-a-primary-key

Postgres не подпадает под эти ограничения, поэтому вы можете просто добавить одно:

alter table databasechangelog add primary key (id, author, filename);
person a_horse_with_no_name    schedule 15.05.2017

Я создаю таблицу DATABASECHANGELOG в начале с первичным ключом. Это может быть не правильный путь, но это поможет

CREATE TABLE "DATABASECHANGELOG" (
  "ID" varchar(255) NOT NULL,
  "AUTHOR" varchar(255) NOT NULL,
  "FILENAME" varchar(255) NOT NULL,
  "DATEEXECUTED" datetime NOT NULL,
  "ORDEREXECUTED" varchar(10) NOT NULL,
  "EXECTYPE" varchar(45) NOT NULL,
  "MD5SUM" varchar(35) DEFAULT NULL,
  "DESCRIPTION" varchar(255) DEFAULT NULL,
  "COMMENTS" varchar(255) DEFAULT NULL,
  "TAG" varchar(255) DEFAULT NULL,
  "LIQUIBASE" varchar(20) DEFAULT NULL,
  "CONTEXTS" varchar(255) DEFAULT NULL,
  "LABELS" varchar(255) DEFAULT NULL,
  "DEPLOYMENT_ID" varchar(10) DEFAULT NULL,
  PRIMARY KEY ("ID")
)
person mgms_kumara    schedule 14.02.2021
comment
ID не является первичным ключом. Первичный (уникальный) ключ этой таблицы состоит из id, author и filename - person a_horse_with_no_name; 14.02.2021