Vous n'êtes pas identifié(e).
Pages : 1
Bonjour,
PostgreSQL 9.4 sur Thinkpad W500 Vista build 6002
J'ai introduit de l'héritage dans mon modèle de la façon suivante:
Table entreprise = table mère.
Tables bureau d'étude, maitre d'oeuvre, fabricant, gestionnaire. Ces 4 tables héritent de la table entreprise.
J'ai commencé à charge la base en utilisant pdAdminIII/afficher les données/visualiser les 100 premières lignes.
J'ai fait l'erreur de charger en commençant par les tables filles. Celles-ci ont été définies avec 6 colonnes présentent dans la table mère et 4 colonnes propres à la table fille. J'ai saisi l'entreprise correspondant à chaque fille dans la grille de la table fille.
Résultat: la table entreprise a été mis à jour automatiquement avec des lignes dont la clé est dupliquée. Par ex. si dans la table bureau d'étude j'ai entré 4 bureaux d'étude avec le même code entreprise, je retrouve 4 lignes ayant le même code entreprise dans la table entreprise.
Comment faire pour revenir à une ligne dans la table mère ? (postgreSQL refuse la suppression de 3 lignes sur 4).
La doc dit: "si villes.nom est déclarée UNIQUE ou clé primaire (PRIMARY KEY), cela n'empêche pas la table capitales de posséder des
lignes avec des noms dupliqués dans villes. Et ces lignes dupliquées s'affichent par défaut dans les requêtes sur villes. En fait,
par défaut, capitales n'a pas de contrainte d'unicité du tout et, du coup, peut contenir plusieurs lignes avec le même nom. Une
contrainte d'unicité peut être ajoutée à capitales mais cela n'empêche pas la duplication avec villes ;"
Je ne sais pas si cela s'applique vraiement au pb que j'ai décrit.
Pour résoudre ce problème, je pense défaire ce que j'ai saisi dans la base (table mère et filles) mais comme il y a beaucoup de clés étrangères c'est un long labeur!!!
Je vous remercie de vos suggestions.
Hors ligne
J'ai fait l'erreur de charger en commençant par les tables filles
Ce n'est pas une erreur, c'est comme ça qu'il faut faire.
L'héritage dans PostgreSQL concerne la structure des tables uniquement. Le fait d'insérer dans une table fille ne propage pas les
données dans la table mère et l'inverse non plus.
Une erreur classique quand on débute avec l'héritage est de croire qu'on accède aux données de la table mère en faisant:
SELECT * FROM table_mere;
En réalité ce SELECT renvoie bien les lignes de la table mère s'il y en a, mais aussi celles de toutes les
tables filles pour la partie des colonnes héritant de la table mère.
Il faut faire:
SELECT * FROM ONLY table_mere;
pour avoir les lignes de la table parent sans celles des tables héritées. Dans le cas typique où cette table parente sert uniquement à définir une structure héritable, elle ne contiendra aucune ligne.
Dernière modification par dverite (09/02/2015 15:36:41)
@DanielVerite
http://blog-postgresql.verite.pro/
Hors ligne
Merci beaucoup dverite. Je passais également par la table mère et je ne comprenais pas d'où venait le problème.
Bonjour, je travaille pour une société qui propose met en relation des artisans de confiance avec des particuliers et qui utilise le logiciel PostgreSQL. N’étant pas très familier avec cette base de données, je me suis inscrit sur ce forum afin de pouvoir trouver des réponses à mes questions.
Hors ligne
Pages : 1