2 votes

mettre à jour les données d'une table à une autre (dans une base de données)

Gourous de la DB,

J'espère que quelqu'un pourra me mettre sur la bonne voie.

J'ai deux tableaux. La table A et la table B. Lorsque le système démarre, toutes les entrées de la table A sont massées et copiées dans la table B (selon le schéma de la table B). La table A peut contenir des dizaines de milliers de lignes.

Pendant que le système est en service, la table B est maintenue en synchronisation avec la table A par le biais des notifications de modification de la base de données.

Si le système est redémarré, ou si mon service est redémarré, je veux réinitialiser la table B. Cependant, je veux le faire avec le moins de mises à jour possible de la base de données. Plus précisément, je veux :

  • ajouter toutes les lignes qui figurent dans le tableau A, mais pas dans le tableau B, et
  • supprimer toutes les lignes qui ne figurent pas dans le tableau A, mais dans le tableau B
  • toutes les lignes communes aux tableaux A et B doivent être laissées intactes

Je ne suis pas un "spécialiste de la base de données", et je me demande donc quelle est la manière conventionnelle de procéder.

2voto

Donnie Points 17312

Utilice exists pour réduire au minimum le traitement.

Quelque chose de ce genre, modifié pour que les jointures soient correctes (vérifiez également que je n'ai pas fait quelque chose de stupide et obtenu TableA y TableB à rebours de votre description) :

insert into TableB
    select 
        *
    from
        TableA a
    where
        not exists (select 1 from TableB b where b.ID = a.ID)

delete from 
    TableB b
where
    not exists (select 1 from TableA a where a.ID = b.ID)

1voto

RET Points 6044

Les fonctions de réplication d'entreprise d'Informix feraient tout cela pour vous. ER fonctionne en envoyant les journaux logiques d'un serveur à l'autre, et en les transférant sur le secondaire.

Vous pouvez le configurer de manière à ce qu'il soit aussi fin que vous le souhaitez (c'est-à-dire seulement une poignée de tables).

Vous utilisez le terme "notifications de changement de BD" - utilisez-vous déjà le RE ou s'agit-il d'un arrangement basé sur un déclencheur ?

Si, pour une raison quelconque, ER ne peut pas fonctionner dans votre configuration, je vous suggère de réécrire le modèle de notification pour qu'il se comporte de manière asynchrone :

  • écrire des notifications dans une table du serveur "A" qui contient un champ horodateur ou série
  • créer une table sur le serveur "B" qui stocke l'horodatage/la valeur de série du dernier enregistrement traité
  • exécuter un processus démon sur le serveur 'B' qui :
    • compare les horodateurs/séries "A" et "B".
    • sélectionne les enregistrements "A" entre les horodatages "A" et "B".
    • traite ces enregistrements dans "B".
    • mise à jour de l'horodatage et du numéro de série de "B".
    • dormir pendant une période de temps appropriée, et boucle

Le serveur 'B' est donc chargé de s'assurer que sa copie est synchronisée avec 'A'. A n'est pas gêné par l'indisponibilité de B.

0voto

David Brunelle Points 2705

Une façon simple serait d'utiliser une table historique dans laquelle vous mettriez les changements de A qui se sont produits depuis la dernière mise à jour, et d'utiliser cette table pour synchroniser la table B au lieu d'une copie directe de A vers B. Une fois la synchronisation effectuée, vous supprimez toute la table historique et recommencez.

Ce que je ne comprends pas, c'est comment la table A peut être mise à jour et pas la B si votre service ou votre ordinateur ne fonctionne pas. Se trouvent-ils sur deux bases de données ou serveurs différents ?

0voto

paweloque Points 4467

Joignez les données des deux tableaux selon les colonnes communes et vous obtiendrez les lignes qui ont une correspondance dans les deux tableaux, c'est-à-dire les données dans A et dans B. Ensuite, utilisez ces valeurs (appelons-les ensemble M) avec des opérations d'ensemble, c'est-à-dire des opérations d'ensemble moins pour obtenir les différences.

première exigence : A moins M deuxième exigence : B moins A troisième exigence : M

Vous saisissez l'idée ?

0voto

priyanka.sarkar Points 5980

Je suis un spécialiste de Sql Server, mais depuis Sql Server 2008, pour ce type d'opération, une fonction appelée MERGE est disponible.

En utilisant l'instruction MERGE, nous pouvons effectuer des opérations d'insertion, de mise à jour et de suppression dans une seule instruction.

Alors j'ai cherché sur Google et j'ai trouvé que Informix also supports the same MERGE mais je ne suis pas sûr qu'elle s'occupe aussi de la suppression ou non, bien que l'insertion et la mise à jour soient prises en charge. De plus, cette instruction prend en charge la transaction par elle-même.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X