web-dev-qa-db-fra.com

Ajouter Inclure le terme à l'index de clé primaire à Postgres 11

Je travaille avec Postgres 11 et je voudrais changer l'index qui recule la clé primaire d'une grande table (environ 750 millions de rangées). La clé primaire est la colonne bigintid et je voudrais inclure une colonne supplémentaire à l'aide du terme INCLUDE. Cela doit se produire sans une réécriture de table (c'est-à-dire pas de colonnes nouvelles/modifiées).

Laisser tomber le courant PRIMARY KEY La contrainte n'est pas commode, car beaucoup d'autres tables font référence à la table cible. Je suppose qu'il serait possible de laisser tomber le FOREIGN KEY contraintes sur toutes ces tables, puis déposer le PRIMARY KEY contrainte, recrée à l'aide d'un nouvel index puis recréer le FOREIGN KEY contraintes. Y a-t-il une meilleure façon de le faire?

5
tomka

Sans gâcher avec les catalogues (qui n'est pas louable), la seule option que je peux penser que vous auriez besoin de faire sans clés étrangères pendant un moment:

Vous pouvez définir une seconde UNIQUE index sur la table contenant la clause INCLUDE appropriée.

Si vous utilisez la clause CONCURRENTLY de CREATE INDEX, cela ne devrait pas être perturbateur.

Ensuite, vous pouvez supprimer la contrainte principale d'origine et toutes les clés étrangères dépendantes à l'aide de DROP INDEX ... CASCADE.

Ensuite, utilisez ALTER TABLE ... ADD CONSTRAINT ... USING INDEX Pour transformer l'index unique en une contrainte principale.

Maintenant, vous pouvez recréer les contraintes de clé étrangère.

3
Laurenz Albe