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 bigint
id
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?
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.