2010-11-23 17 views
1

Bonjour J'ai une table principale BASECOMPANYDATA avec BaseCompanyDataID comme PK. Ceci est hérité par 2 autres tables CLIENTS & PRODUCTCOMPANIES. Maintenant, j'ai la table CONTACTS que je veux se connecter avec les 2 autres comme les clients et les compagnies de produit auront 0 ou plus de contacts. J'ai donc créé un FK (BaseCompanyID) dans CONTACTS et je me suis connecté à la base de données BASECOMPANYDATA PK (BaseCompanyDataID). Mais quand j'essaye d'insérer un contact pour un enregistrement qui existe dans CLIENTS j'obtiens l'erreur suivante: ERREUR: insérer ou mettre à jour sur la table "xxxxx" viole la clé étrangère contraindre "xxxxx" DETAIL: Clé (BaseCompanyDataID) = (17) n'est pas présent dans la table "BaseCompanyData". Cet ID existe dans la table héritée ci-dessus (BaseCompanyData). Quelqu'un peut-il expliquer pourquoi cela se passe-t-il?postgres ERREUR: insérer ou mettre à jour sur la table "xxxxx" viole la clé étrangère contraindre "xxxxx"

Merci à l'avance

PS: Eh bien, j'ai 4 tables:

1.BASECOMPANYDATA avec BaseCompanyDataID PK et d'autres domaines. 2. CLIENTS qui hérite de la table ci-dessus pour avoir CustomerID comme PK et a les champs de la table BASECOMPANYDATA à savoir BaseCompanyDataID etc. 3.PRODUCTCOMPANIES qui hérite de BASECOMPANYDATA de sorte qu'il a les champs ProductCompanyID comme PK et les champs des hérités table comme BaseCompanyDataID 4.CONTACTS avec ContactID comme PK et BaseCompanyDataID comme FK. J'ai essayé de connecter les CONTACTS de table avec 2 manières différentes. une. CONTACTS-> BaseCompanyID avec CUSTOMERS-> BaseCompanyDataID et CONTACTS-> BaseCompanyID avec PRODUCTCOMPANIES-> BaseCompanyDataID b. CONTACTS-> BaseCompanyID avec BASECOMPANYDATA-> BaseCompanyDataID Le résultat était la même erreur. Toute réponse sur la façon dont je peux créer le FK en utilisant l'héritage, s'il y a. Merci d'avance

+0

Ce serait génial si vous ajoutiez des sauts de ligne à votre question et peut-être un extrait de vos définitions de table. –

Répondre

3

Avez-vous lu les docs d'héritage? Surtout la section 5.8.1. Caveats?

http://www.postgresql.org/docs/9.0/static/ddl-inherit.html

...

Similarly, if we were to specify that cities.name REFERENCES some other table, this constraint would not automatically propagate to capitals. In this case you could work around it by manually adding the same REFERENCES constraint to capitals.

modifier:

héritage est seulement la moitié mis en œuvre dans Postgsresql. Si vous voulez enregistrer la frappe, vérifiez like dans create table

Dans votre première question, je vois la personne recommandée exactement la même chose que je disais. Et maintenant vous avez un problème? Hmm ...

Ce pseudo est sql que je reçois de votre republication:

base 
    baseid 

customers(base) 
    baseid 
    id 

products(base) 
    baseid 
    id 

contacts 
    id 
    baseid references base(baseid) 

Il suffit de faire les choses comme bon vieux!

base 
    id 

customers 
    base_id references base(id) 
    id 

products(base) 
    base_id references base(id) 
    id 

contacts 
    id 
    base_id references base(id) 
+0

Voici comment j'ai démarré dans SQL Server mais je pense qu'il est bon d'utiliser l'héritage de PostgreSQL. Il semble que je reviendrai à ce que j'avais fait dans SQL Server.L'héritage a beaucoup de problèmes. – ekekakos