Eu sou novo no postgreSQL. Eu tenho 3 tabelas, uma tabela referencia as chaves primárias das outras 2 tabelas. Mas não consegui inserir dados no Table3
. Veja o código abaixo:
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
);
ERRO: inserir ou atualizar a tabela "Tabela3" viola a restrição de chave estrangeira "Table3_DataID_fkey" DETALHE: Chave (DataID) = (27856) não está presente na tabela "Tabela1".
Quando tentei inserir dados nas 3 tabelas, ocorreu um erro. Consultei a documentação do postgreSQL e alterei meu código da seguinte forma: (Infelizmente, ele mostrou outro erro)
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")
);
ERRO: várias chaves primárias para a tabela "Tabela3" não são permitidas. LINHA 65: PRIMARY KEY ("DataID", "Address")
Por favor me ajude ... Como posso criar a referência?
Troquei o ID
as UNIQUE
e removi a linha PRIMARY KEY ("ID")
. Naquele momento, mostra outro erro como:
ERRO: o valor duplicado da chave viola a restrição exclusiva "Table3_pkey"
fonte
Tudo depende do que você deseja fazer com os dados.
Primeiro exemplo - você deseja ter dados consistentes em todas as tabelas, mas tenta inserir valores que não correspondem à Tabela1.
Segundo exemplo - você não deseja ter dados consistentes, mas tenta fazer outra coisa, sem saber exatamente o que. A tabela não pode ter mais de uma chave primária.
Terceiro exemplo - você ainda não sabe o que deseja alcançar e coloca restrição UNIQUE na coluna que pode ter o mesmo valor várias vezes.
Se você apenas deseja inserir seus dados, livre-se das referências de chave estrangeira no primeiro exemplo. Se você deseja ter dados consistentes em todas as tabelas - faça a limpeza dos dados e insira nas tabelas COM restrições de chave estrangeira.
tl; dr: para inserir seus dados na Tabela3 com o código do primeiro exemplo - insira valores ausentes na coluna Table1.DataID que existe na Tabela3.DataId.
fonte