Complètement la copie d'un postgres table avec SQL

AVERTISSEMENT: Cette question est similaire à la dépassement de pile question ici, mais aucune de ces réponses pour mon problème, comme je l'expliquerai plus tard.

Je suis en train de copier un tableau de grande taille (~40M lignes, 100+ colonnes) dans postgres, où beaucoup de colonnes sont indexées. Actuellement, je utiliser ce bits de SQL:

CREATE TABLE <tablename>_copy (LIKE <tablename> INCLUDING ALL);
INSERT INTO <tablename>_copy SELECT * FROM <tablename>;

Cette méthode a deux questions:

  1. Il ajoute que les indices avant que les données de l'ingestion, de sorte qu'il sera beaucoup plus long que la création de la table sans indices et ensuite l'indexation après la copie de toutes les données.
  2. Ce n'est pas copier `SERIAL' des colonnes de style correctement. Au lieu de créer un nouveau "compteur" sur le nouveau tableau, il définit la valeur par défaut de la colonne dans la nouvelle table au comptoir du passé table, sens de ne pas incrémenter comme des lignes sont ajoutées.

La taille de la table fait de l'indexation d'un problème en temps réel. Il rend également impossible de la vider sur un fichier puis de le ré-acquisition. Je n'ai pas aussi l'avantage d'une ligne de commande. J'ai besoin de le faire en SQL.

Ce que je voudrais faire est de droite créer une copie exacte avec certains miracle de commande, ou si ce n'est pas possible, pour copier le tableau avec toutes les contraintes, mais sans indices, et assurez-vous qu'ils sont les contraintes 'dans l'esprit' (aka un nouveau compteur pour une SÉRIE de colonnes). Puis, copie toutes les données avec un SELECT * puis copiez tous les indices.

Sources

  1. Un Débordement de pile question à propos de la copie de la base de données: Ce n'est pas ce que je suis demander ce, pour trois raisons

    • Il utilise l'option de ligne de commande pg_dump -t x2 | sed 's/x2/x3/g' | psql et dans ce cadre je n'ai pas accès à la ligne de commande
    • Il crée les indices de pré données de l'acquisition, qui est trop lent
    • Il n'a pas de mise à jour de la série des colonnes correctement, comme l'attestent les default nextval('x1_id_seq'::regclass)
  2. Méthode pour réinitialiser la valeur de la séquence pour une postgres table: C'est très bien, mais malheureusement, il est très manuel.

  • Votre question est probablement une copie de stackoverflow.com/questions/198141/...
  • J'ai vu cette question, il n'y avait pas de réponses satisfaisantes qui peut réellement faire ce que je demande, mais cela me demande de faire un autre edit de mon post.
  • Il n'y a pas une meilleure réponse.
  • Il y a trois problèmes majeurs avec le plus voté solution sur cette page. L'un, ils utilisent la ligne de commande fonctions dans pg_dump -t x2 | sed 's/x2/x3/g' | psql que je n'ai pas accès trop. De deux, Il crée les indices avant d'ajouter les données qui seront très lent! Trois, le numéro de SÉRIE par défaut du paramètre références à la première table default nextval('x1_id_seq'::regclass). Ces trois défauts je l'ai déjà indiqué dans ma question. Vous me dites il n'y a pas de solution à l'un de ces? @peter
  • Ce n'est qu'une Question de Programmation.
InformationsquelleAutor Erik | 2011-07-06