Je suis un nouveau dans postgreSQL. J'ai 3 tables, une table fait référence aux clés primaires des 2 autres tables. Mais je n'ai pas pu insérer de données dans le Table3
. Voir le code ci-dessous:
DROP TABLE Table1 CASCADE;
CREATE TABLE Table1(
"DataID" bigint NOT NULL DEFAULT '0',
"AdData" integer DEFAULT NULL,
PRIMARY KEY ("DataID")
);
DROP TABLE IF EXISTS Table2 CASCADE;
CREATE TABLE Table2 (
"Address" numeric(20) NOT NULL DEFAULT '0',
"Value" numeric(20) DEFAULT NULL,
PRIMARY KEY ("Address")
);
DROP TABLE IF EXISTS Table3 CASCADE;
CREATE TABLE table3 (
"ID" bigint NOT NULL DEFAULT '0',
"DataID" bigint DEFAULT NULL,
"Address" numeric(20) DEFAULT NULL,
"Data" bigint DEFAULT NULL,
PRIMARY KEY ("ID"),
FOREIGN KEY ("DataID") REFERENCES Table1("DataID") on delete cascade on update cascade,
FOREIGN KEY ("Address") REFERENCES Table2("Address") on delete cascade on update cascade
);
ERREUR: l'insertion ou la mise à jour sur la table "Table3" viole la contrainte de clé étrangère "Table3_DataID_fkey" DÉTAIL: La clé (DataID) = (27856) n'est pas présente dans la table "Table1".
Lorsque j'ai essayé d'insérer des données dans les 3 tables, une erreur s'est produite. J'ai référé la documentation postgreSQL et changé mon code comme suit: (Malheureusement, il a montré une autre erreur)
DROP TABLE Table1 CASCADE;
CREATE TABLE Table1(
"DataID" bigint NOT NULL DEFAULT '0',
"AdData" integer DEFAULT NULL,
PRIMARY KEY ("DataID")
);
DROP TABLE IF EXISTS Table2 CASCADE;
CREATE TABLE Table2 (
"Address" numeric(20) NOT NULL DEFAULT '0',
"Value" numeric(20) DEFAULT NULL,
PRIMARY KEY ("Address")
);
DROP TABLE IF EXISTS Table3 CASCADE;
CREATE TABLE table3 (
"ID" bigint NOT NULL DEFAULT '0',
"DataID" bigint DEFAULT NULL REFERENCES Table1 ON DELETE RESTRICT,
"Address" numeric(20) DEFAULT NULL REFERENCES Table2 ON DELETE CASCADE,
"Data" bigint DEFAULT NULL,
PRIMARY KEY ("ID"),
PRIMARY KEY("DataID", "Address")
);
ERREUR: plusieurs clés primaires pour la table "Table3" ne sont pas autorisées LIGNE 65: CLÉ PRIMAIRE ("DataID", "Adresse")
S'il vous plaît, aidez-moi ... Comment puis-je créer la référence?
J'ai changé le ID
as UNIQUE
et supprimé la ligne PRIMARY KEY ("ID")
. À ce moment, il montre une autre erreur comme:
ERREUR: la valeur de clé en double viole la contrainte unique "Table3_pkey"
la source
Tout dépend de ce que vous voulez faire des données.
Premier exemple - vous voulez avoir des données cohérentes dans toutes les tables, mais vous essayez d'insérer des valeurs qui ne correspondent pas à Table1.
Deuxième exemple - vous ne voulez pas avoir de données cohérentes, mais essayez de faire autre chose, sans savoir exactement quoi. La table ne peut pas avoir plus d'une clé primaire.
Troisième exemple - vous ne savez toujours pas ce que vous voulez réaliser et mettez une contrainte UNIQUE sur une colonne qui peut avoir plusieurs fois la même valeur.
Si vous souhaitez simplement insérer vos données, supprimez les références de clés étrangères dans le premier exemple. Si vous souhaitez avoir des données cohérentes dans toutes les tables, effectuez le nettoyage des données, puis insérez-les dans les tables AVEC des contraintes de clé étrangère.
tl; dr: pour insérer vos données dans Table3 avec le code du premier exemple - insérez les valeurs manquantes dans la colonne Table1.DataID qui existent dans Table3.DataId.
la source