Soy nuevo en postgreSQL. Tengo 3 tablas, una tabla hace referencia a las otras 2 claves principales de la tabla. Pero no pude insertar datos en el Table3
. Vea el código a continuación:
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
);
ERROR: insertar o actualizar en la tabla "Tabla3" viola la restricción de clave externa "Tabla3_DataID_fkey" DETALLE: Clave (DataID) = (27856) no está presente en la tabla "Tabla1".
Cuando intenté insertar datos en las 3 tablas, ocurrió un error. Me he referido la documentación de PostgreSQL y cambiado de código como sigue: (Por desgracia, mostró otro error)
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")
);
ERROR: no se permiten varias claves principales para la tabla "Tabla3" LÍNEA 65: CLAVE PRIMARIA ("ID de datos", "Dirección")
Por favor, ayúdame ... ¿Cómo puedo crear la referencia?
Cambié el ID
as UNIQUE
y eliminé la línea PRIMARY KEY ("ID")
. En ese momento muestra otro error como:
ERROR: el valor de clave duplicada viola la restricción única "Table3_pkey"
fuente
Todo depende de lo que quieras hacer con los datos.
Primer ejemplo: desea tener datos consistentes en todas las tablas, pero intenta insertar valores que no coinciden con Table1.
Segundo ejemplo: no desea tener datos consistentes, pero intente hacer otra cosa, no saber exactamente qué. La tabla no puede tener más de una clave primaria.
Tercer ejemplo: aún no sabe lo que quiere lograr y coloca una restricción ÚNICA en la columna que puede tener el mismo valor varias veces.
Si solo desea insertar sus datos, elimine las referencias de claves externas en el primer ejemplo. Si desea tener datos consistentes en todas las tablas, realice la limpieza de los datos y luego insértelos en las tablas CON restricciones de clave externa.
tl; dr: para insertar sus datos en Table3 con el código del primer ejemplo: inserte los valores faltantes en la columna Table1.DataID que existen en Table3.DataId.
fuente