Fórum PostgreSQL erro de chave estrangeira #485024

09/07/2014

0

Como faço para resolver o error abaixo?

WARNING ] CREATE TABLE pagamentos(
empenho cdEmpenho NOT NULL,
ano SMALLINT NOT NULL,
unidadeGestora cd_cpfCNPJ NOT NULL,
mes VARCHAR(03) NOT NULL CHECK (mes in('jan','fev','mar','abr','mai','jun','jul','ago','set','out','nov','dez')),
PRIMARY KEY (empenho, ano, unidadeGestora),
CONSTRAINT empenho_fk FOREIGN KEY(empenho) REFERENCES empenhos(empenho) MATCH SIMPLE ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT unidadeGestora_fk FOREIGN KEY (unidadeGestora) REFERENCES unidadeGestora(cnpj) MATCH SIMPLE ON UPDATE CASCADE ON DELETE CASCADE
) WITH (OIDS=FALSE)
NOTA: CREATE TABLE / PRIMARY KEY criará índice implícito "pagamentos_pkey" na tabela "pagamentos"
ERRO: não há restrição de unicidade que corresponde com as colunas informadas na tabela referenciada "empenhos"

/* TABELA EMPENHOS */
CREATE TABLE empenhos(
empenho cdEmpenho NOT NULL,
ano SMALLINT NOT NULL,
unidadeGestora cd_cpfCNPJ NOT NULL,
historico TEXT NOT NULL,
credor cd_cpfCNPJ NOT NULL,
PRIMARY KEY (empenho, ano, unidadeGestora),
CONSTRAINT unidadeGestora_fk FOREIGN KEY(unidadeGestora) REFERENCES unidadeGestora(cnpj) MATCH SIMPLE ON UPDATE CASCADE ON DELETE CASCADE
) WITH (OIDS=FALSE);

/* TABELA PAGAMENTOS */
CREATE TABLE pagamentos(
empenho cdEmpenho NOT NULL,
ano SMALLINT NOT NULL,
unidadeGestora cd_cpfCNPJ NOT NULL,
PRIMARY KEY (empenho, ano, unidadeGestora),
CONSTRAINT empenho_fk FOREIGN KEY(empenho) REFERENCES empenhos(empenho) MATCH SIMPLE ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT unidadeGestora_fk FOREIGN KEY (unidadeGestora) REFERENCES unidadeGestora(cnpj) MATCH SIMPLE ON UPDATE CASCADE ON DELETE CASCADE
) WITH (OIDS=FALSE);
Adenes Junior

Adenes Junior

Responder

Posts

09/07/2014

Ronaldo Lanhellas

Acontece que você está usando uma chave estrangeira na tabela "pagamentos", porém na tabela "empenhos" essa chave é composta, sendo assim o banco não pode garantir a unicidade.

Para funcionar você teria que criar uma chave estrangeira em "pagamentos" contendo os campos: empenho, ano, unidadeGestora
Responder

Gostei + 0

10/07/2014

Adenes Junior

no caso assim:

CONSTRAINT fk_1 FOREIGN (empenho, ano, unidadeGestora) REFERENCES empenhos(empenho, ano, unidadeGestora)
Responder

Gostei + 0

10/07/2014

Ronaldo Lanhellas

Isso mesmo.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar