Dois Campos na Chave Estrangeira

Firebird

13/01/2006

Puxa vida, estou com um problemão...
Tenho uma tabela Setor, uma tabela Cargo e uma tabela Funcionário.
 _________     _________     _________
|         |   |         |   |         |
|  SETOR  |<--|  CARGO  |<--|FUNCION. |
|_________|   |_________|   |_________|
idsetor       idsetor       (idsetor)
              idcargo       (idcargo)

A tabela Setor tem o campo IDSetor como chave primária.
A tabela Cargo tem os campos IDSetor e IDCargo como chave primária.

O campo IDSetor da tabela Cargo faz chave primária com o campo IDSetor da tabela Setor.

Eu queria que os campos IDSetor e IDCargo da tabela de Funcionários fizessem chave primária com os campos IDSetor e IDCargo da tabela Cargo, mas não consigo.

Eu tentei executar o seguinte código:
alter table FUNCIONARIO
add constraint FK_FUNCIONARIO_1
foreign key (IDSETOR,IDCARGO)
references CARGO(IDCARGO,IDSETOR);


Mas o Firebird retorna uma mensagem dizendo que esse comando viola a chave primária da tabela CARGO(idsetor,idcargo):
/*******************************************************************************
The next statement causes the following error:

violation of FOREIGN KEY constraint ´´.
violation of FOREIGN KEY constraint ´PK_CARGO´ on table ´CARGO´.
*******************************************************************************/

Não estou entendendo. Qual é o problema?


Mordred

Mordred

Curtidas 0

Respostas

Thomaz_prg

Thomaz_prg

13/01/2006

Verifique se os campos idsetor e idcargo da tabela funcionários não estam marcadas para aceitar nulos. Se estiver, deixe estes campos como not null.


GOSTEI 0
Raserafim

Raserafim

13/01/2006

caso na tabela FUncionários tenha algum registro que não tenha na tabela cargos, este erro tb vai ocorrer.

sugestão: apague todos os registros e tente novamente da forma como vc está fazendo. e observe o q o colega falou, q isto tb acontece muito, principalmente quando é alguma alteração na tabela.


GOSTEI 0
Xtreme

Xtreme

13/01/2006

alter table FUNCIONARIO
add constraint FK_FUNCIONARIO_1
foreign key (IDSETOR,IDCARGO)
references CARGO(IDCARGO,IDSETOR);


Vc deve seguir a ordem correta ao que me parece a ordem no teu sql esta invertida, o correto seria assim

alter table FUNCIONARIO
add constraint FK_FUNCIONARIO_1
foreign key (IDSETOR,IDCARGO)
references CARGO([b]IDSETOR,IDCARGO[/b]);


caso realmente seja isto! Tenta ai e ve se roda!


GOSTEI 0
Mordred

Mordred

13/01/2006

Não tive tempo de testar as outras soluções, mas a solução do Xtreme funcionou certinho aqui! PQP, onde já se viu trocar a ordem dos campos na chave? Depois dessa eu mereço o troféu abacaxi :P:P:P

Valeu mesmo, galera!


GOSTEI 0
POSTAR