La base de données ressemble à ceci. Forme courte:Plusieurs clés étrangères à plusieurs tables
CREATE TABLE LANDSLIDE (
LNUMBER SERIAL NOT NULL,
PRIMARY KEY (LNUMBER)
...
Il 4 Les tableaux similaires (parties d'un glissement de terrain)
CREATE TABLE SCARP (
SCPNUM CHAR(7) NOT NULL,
LNUMBER SMALLINT NOT NULL,
FOREIGN KEY (LNUMBER) REFERENCES LANDSLIDE (LNUMBER) ON DELETE CASCADE,
...
);
par exemple scpnum = scp0001
CREATE TABLE ACCUMULATION (
ACCUNUM CHAR(8) NOT NULL,
LNUMBER SMALLINT NOT NULL,
FOREIGN KEY (LNUMBER) REFERENCES LANDSLIDE (LNUMBER) ON DELETE CASCADE,
...
);
par exemple. accunum = accu0001
CREATE TABLE FRONT (
FRNUM CHAR(6) NOT NULL,
LNUMBER SMALLINT NOT NULL,
FOREIGN KEY (LNUMBER) REFERENCES LANDSLIDE (LNUMBER) ON DELETE CASCADE,
...
);
par ex. frnum = fr0001
CREATE TABLE OTHER (
OTHERNUM CHAR(9) NOT NULL,
LNUMBER SMALLINT NOT NULL,
FOREIGN KEY (LNUMBER) REFERENCES LANDSLIDE (LNUMBER) ON DELETE CASCADE,
...
);
par exemple. othernum = other0001
Il existe une autre table, appelée matériau (pierres différentes, sols sur les différentes parties).
CREATE TABLE MATERIAL (
MATNUMBER VARCHAR(9) NOT NULL,
ROCK,
DISTRIBUTION,
...
PRIMARY KEY(MATNUMBER,ROCK,DISTRIBUTION,...),
CONSTRAINT material_matnumber_scarp_fkey FOREIGN KEY
(MATNUMBER) REFERENCES SCARP (SCPNUM) ON DELETE CASCADE,
CONSTRAINT material_matnumber_accumulation_fkey FOREIGN KEY
(MATNUMBER) REFERENCES ACCUMULATION (ACCUNUM) ON DELETE CASCADE,
CONSTRAINT material_matnumber_front_fkey FOREIGN KEY
(MATNUMBER) REFERENCES FRONT (FRNUM) ON DELETE CASCADE,
CONSTRAINT material_matnumber_other_fkey FOREIGN KEY
(MATNUMBER) REFERENCES OTHER (OTHERNUM) ON DELETE CASCADE
);
Lorsque j'insère des données sur le matériau (après avoir fait des entrées aux autres tables), il renvoie une erreur. ERREUR: insérer ou mettre à jour le tableau "matériel" viole la contrainte de clé étrangère "material_matnumber_accumulation_fkey" DETAIL: Key (matnumber) = (scp0001) est pas présent dans le tableau "accumulation"
Le matériel de table devrait ressembler à ceci:
MATNUMBER | ROCK | DISTRIBUTION | ...
----------+------+--------------+------
scp0001 | A | lateral | ...
scp0001 | B | lateral | ...
accu0001 | B | central | ...
scp0002 | C | NULL |
accu0002 | A | lateral |
fr0002 | A | NULL |
scp0003 | B | cantral |
accu0003 | B | lateral |
other0003 | C | NULL |
Chaque entrée est unique, en raison du numéro de matricule!
Eh bien, est-il une ligne dans '' ACCUMULATION' où ACCUNUM = 'scp0001''? –
Ce que vous essayez de faire ne fonctionne pas.Le numéro de matricule 'scp0001' devra exister aussi dans toutes les tables que les clés étrangères, pas seulement' SCRAP'. Vous devrez créer plusieurs colonnes, une pour chaque clé étrangère. Vous pouvez les regrouper tous dans une colonne en utilisant une vue ou quelque chose. – JodyT
Je pense que vos clés étrangères sont à l'envers. –