2017-05-15 1 views
0

J'essaie de migrer la base de données de l'ancien PostgreSQL (9.3) vers le nouveau PostgreSQL (9.5, 9.6) de Bucardo.Comment correct ajouter la clé primaire à databasechangelog (PostgreSQL) pour Liquibase?

Bucardo a utilisé la clé primaire pour la migration.

J'ai de nombreuses bases de données avec public.databasechangelog sans clé primaire. Comment correct ajouter la clé primaire à databasechangelog (PostgreSQL) pour Liquibase?

Mise à jour de la réponse: Je peux ajouter la clé primaire par SQL, mais peut-on avoir le paramètre Liquibase pour la clé primaire ajoutée en XML?

Clé primaire ajoutée par SQL à public.databasechangelog en toute sécurité?

+0

https://www.postgresql.org/docs/current/static/sql-altertable .html –

+0

Liquibase [n'utilisant pas intentionnellement une clé primaire] (https://liquibase.jira.com/browse/CORE-1909) pour cette table. Mais le cas de bordure (qui est mentionné dans le bogue) ne semble pas s'appliquer à PostgreSQL (tant que vous n'avez pas ** vraiment ** de grands ID de migration - c'est-à-dire au-dessus de 1 Go). – pozs

+1

@pozs: 'id' est limité à 255 caractères. Le total max. La taille de ces trois colonnes est de 765 caractères - quelque chose qu'un SGBD moderne devrait pouvoir indexer. La non-existence du PK est en effet causée par les limitations de certains SGBD: http://forum.liquibase.org/topic/why-does-databasechangelog-not-have-a-primary-key (les anciennes versions de Liquibase en fait avoir une clé primaire sur cette table) –

Répondre

0

Les développeurs de Liquibase ont décidé d'enlever la clé primaire de cette table car apparemment certains SGBD ont un problème avec la création d'un index sur ces trois colonnes en raison des limites sur la taille maximale d'une entrée d'index.

Voir par exemple. cette discussion: http://forum.liquibase.org/topic/why-does-databasechangelog-not-have-a-primary-key

Postgres ne sont pas soumis à ces limites, vous devriez donc être bien simplement ajouter un:

alter table databasechangelog add primary key (id, author, filename); 
+0

Merci! Puis-je utiliser le code: > DROP SEQUENCE IF EXISTS "changelog_seq" CASCADE; > CREATE SEQUENCE "changelog_seq" START 1; > ALTER TABLE databasechangelog AJOUTER COLONNE synthetic_id BIGINT PRIMARY KEY par défaut nextval ('changelog_seq'); –

+0

Merci! Puis-je utiliser le code? SÉQUENCE DE CHUTE SI EXISTE "changelog_seq" CASCADE; CREATE SEQUENCE "changelog_seq" START 1; ALTER TABLE databasechangelog AJOUTER COLONNE synthetic_id BIGINT PRIMARY KEY par défaut nextval ('changelog_seq'); –

+0

Merci! Puis-je utiliser le code? SÉQUENCE DE CHUTE SI EXISTE "changelog_seq" CASCADE; CREATE SEQUENCE "changelog_seq" START 1; ALTER TABLE databasechangelog AJOUTER COLONNE synthetic_id BIGINT PRIMARY KEY par défaut nextval ('changelog_seq');