déplacer des données d'une table à une autre, édition postgresql
Je voudrais déplacer des données à partir d'une table à l'autre (avec, éventuellement, un autre schéma). Solution immédiate qui vient à l'esprit est -
start a transaction with serializable isolation level;
INSERT INTO dest_table SELECT data FROM orig_table,other-tables WHERE <condition>;
DELETE FROM orig_table USING other-tables WHERE <condition>;
COMMIT;
Maintenant, si la quantité de données est plutôt grand, et la <condition>
est onéreux? Dans PostgreSQL, une RÈGLE ou une procédure stockée peut être utilisée pour supprimer des données à la volée, l'évaluation de la condition qu'une seule fois. Quelle solution est la meilleure? Existe-il d'autres options?
source d'informationauteur IggShaman
Vous devez vous connecter pour publier un commentaire.
[L'expansion sur dvv réponse]
Vous pouvez vous déplacer d'une table existante comme suit. Pour inégalée schéma, vous devez spécifier des colonnes.
Mais que vous souhaitez déplacer les données dans un nouveau table (non existant), l'extérieur de la syntaxe est différente:
Si la condition est si compliqué que vous ne voulez pas exécuter deux fois (BTW semble peu probable pour moi, mais de toute façon), une possibilité serait de
ALTER TABLE ... ADD COLUMN
sur la table d'origine pour ajouter un champ booléen, et d'exécuter uneUPDATE
sur la table pour définir le champ de vraiWHERE <condition>
. Ensuite, votreINSERT
etDELETE
commandes, il suffit de cocher cette colonne pour leurWHERE
clauses.Ne pas oublier de supprimer la colonne à partir de deux tables source et de destination pour la suite!
Hmm, encore moins intrusive serait de créer une nouvelle table temporaire dont le seul but est de contenir les PKs de dossiers que vous voulez inclure. Première
INSERT
à ce tableau pour "définir" l'ensemble des lignes pour fonctionner sur, puis se joindre à cette table pour la table-la copieINSERT
etDELETE
. Ces jointures seront vite, puisque la table de PKs sont indexés.[MODIFIER]
Scott Bailey suggestion dans les commentaires est évidemment la bonne façon de le faire, souhaite que j'avais pensé de moi-même! En supposant que tous les la table d'origine PK de champs présents dans la table de destination, il n'y a pas besoin d'une table temporaire -- suffit d'utiliser le complexe
WHERE
conditions à insérer dans la destination, puisDELETE
de la table d'origine en se joignant à cette table. Je me sens stupide pour suggérant une table séparée maintenant! 🙂Vous pouvez déplacer des données à l'aide de la SEULE requête dans Postgres 9.1
Voir http://www.postgresql.org/docs/9.1/static/queries-with.html
La Section "Données-Modification des États AVEC"
Vous pourriez faire un dump de la table de données dans un fichier, puis l'insérer dans une autre table à l'aide de
COPY
Généralement
COPY
est plus rapide queINSERT
.