PostgreSQL erro de chave estrangeira

PostgreSQL

09/07/2014

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

Curtidas 0

Respostas

Ronaldo Lanhellas

Ronaldo Lanhellas

09/07/2014

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
GOSTEI 0
Adenes Junior

Adenes Junior

09/07/2014

no caso assim:

CONSTRAINT fk_1 FOREIGN (empenho, ano, unidadeGestora) REFERENCES empenhos(empenho, ano, unidadeGestora)
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

09/07/2014

Isso mesmo.
GOSTEI 0
POSTAR