|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Candidat au titre de Membre du Club
![]() Inscription : novembre 2006 Messages : 72 ![]() |
(Postgresql 8.2)
Voila : j'ai deux tables A et B. A contient une clef primaire (id) et B une clef etrangere (id). Il y a au moins 1000 lignes dans B pour chaque id. Il y a 2 lignes dans A (=> 2000 lignes dans B) J'aimerais fusionner les lignes de B avec un seul id de A: Shématiquement, on aurait : Code :
Je pensais par exemple à forcer un update sur une ligne de A (id 1 => 2) ce qui changerait les id dans B, puis de supprimer la ligne de A (mais ça risque de supprimer aussi les lignes de B vu que cette bidouille ne devrait pas être prevue par postgres) Des idées? |
||
|
|
00
|
|
|
#2 | ||
|
Membre habitué
![]() Inscription : août 2007 Messages : 128 ![]() |
Je ne suis pas sûr d'avoir tout compris mais si je suis ce que tu dis je ferais ceci
Code :
|
||
|
|
00
|
|
|
#3 | |
|
Candidat au titre de Membre du Club
![]() Inscription : novembre 2006 Messages : 72 ![]() |
Oui et non
Ce que tu proposes est ce que je ne voulais pas faire Citation:
Sans chipoter sur les clauses WHERE de l'update : Tu agis directement dans B. Si il y a 10 tables "B", tu serais obligé d'avoir 10 fois ton UPDATE. Si je rajoute encore une table Bn, il faudra que je pense à changer la fonction et rajouter un update dedans. C'est ce que je veux éviter de faire. |
|
|
|
00
|
|
|
#4 |
|
Membre habitué
![]() Inscription : août 2007 Messages : 128 ![]() |
Alors explique mieux ton problème, sinon je serais dans l'impossibilité de t'aider
|
|
|
00
|
|
|
#5 | ||||||
|
Candidat au titre de Membre du Club
![]() Inscription : novembre 2006 Messages : 72 ![]() |
C'est faire en gros ce que tu as proposé, sans toucher explicitement à la table B ou alors de façon générique qui éviterait d'avoir à changer la fonction à chaque fois qu'on rajoute/enleve une table B.
L'exemple qui me donne le résultat mais que je ne veux pas utiliser serait le suivant : Code :
Pour le shémas du premier post, ce serait plutot : Code :
Code :
|
||||||
|
|
00
|
|
|
#6 |
|
Invité régulier
![]() Inscription : août 2007 Messages : 10 ![]() |
Si sur B.id il y a la contrainte FOREIGN KEY avec ON UPDATE CASCADE et ON DELETE NO ACTION, tu peux updater la ligne dans A pour modifier d'un coup toutes les lignes de B, puis supprimer la ligne de A (puisqu'il y a un ON DELETE NO ACTION), la vérification de la contrainte de B sur A aura lieu a la fin de la transaction, donc peu importe quelles lignes sont supprimées dans A tant qu'a la fin pour tout id dans B il y en a un dans A
|
|
|
00
|
|
|
#7 | |
|
Candidat au titre de Membre du Club
![]() Inscription : novembre 2006 Messages : 72 ![]() |
Citation:
Si il y a un DELETE NO ACTION : ça veut dire qu'il y a un probleme si je fais un "DELETE FROM A WHERE id=7;" : ça ne nettoyera pas B. Et pire, ça n'effacera pas la ligne dans A parcequ'il n'y aurait plus de lien A-B Ho, mais peut etre que je peux changer pendant la transaction les contraintes sur la clef étrangère pour mettre en NO ACTION, et remettre ensuite CASCADE juste avant la fin de la transaction. Cette solution est-elle viable (perf. ...)? |
|
|
|
00
|
|
|
#8 |
|
Membre habitué
![]() Inscription : août 2007 Messages : 128 ![]() |
La vérification de la contrainte n'a lieu à la fin de la transaction que si les contraintes de la table sont déclarées comme étant déferrable. Voir pour cela la page man de SET CONSTRAINTS (http://www.postgresql.org/docs/8.2/i...nstraints.html).
|
|
|
00
|
|
|
#9 | |
|
Invité régulier
![]() Inscription : août 2007 Messages : 10 ![]() |
Citation:
|
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com