[resolvido] ORA-02291: integrity constraint parent key not found

Pessoal, sou inexperiente com banco de dados e não estou conseguindo resolver esse problema de integridade. Estou usando o banco de dados Oracle XE e tenho as seguintes tabelas:

CREATE TABLE TB_CARGO_MOTORISTA
  (
    PK_CARGO_MOTORISTA INTEGER NOT NULL ,
    CARGO              VARCHAR2 (50 CHAR) NOT NULL ,
    REMUNERACAO FLOAT NOT NULL
  ) ;
ALTER TABLE TB_CARGO_MOTORISTA ADD CONSTRAINT PK_CARGO_MOTORISTA PRIMARY KEY ( PK_CARGO_MOTORISTA ) ;


CREATE TABLE TB_ESTADO_MOTORISTA
  (
    PK_ESTADO_MOTORISTA INTEGER NOT NULL ,
    ESTADO              VARCHAR2 (30 CHAR) NOT NULL
  ) ;
ALTER TABLE TB_ESTADO_MOTORISTA ADD CONSTRAINT PK_ESTADO_MOTORISTA PRIMARY KEY ( PK_ESTADO_MOTORISTA ) ;

CREATE TABLE TB_MOTORISTA
  (
    PK_MOTORISTA        INTEGER NOT NULL ,
    NOME                VARCHAR2 (50 CHAR) NOT NULL ,
    MATRICULA           VARCHAR2 (50 CHAR) NOT NULL ,
    DATA_ADMISSAO       DATE NOT NULL ,
    TITULO_ELEITOR      VARCHAR2 (50 CHAR) NOT NULL ,
    CPF                 INTEGER NOT NULL ,
    IDENTIDADE          INTEGER NOT NULL ,
    ORGAO_EMISSOR_ID    VARCHAR2 (20 CHAR) NOT NULL ,
    PIS_PASEP           VARCHAR2 (50 CHAR) NOT NULL ,
    ESCOLARIDADE        VARCHAR2 (50 CHAR) NOT NULL ,
    CARTEIRA_TRABALHO   VARCHAR2 (50 CHAR) NOT NULL ,
    DATA_EMISSAO_CT     DATE NOT NULL ,
    NATURALIDADE        VARCHAR2 (50 CHAR) NOT NULL ,
    ESTADO_CIVIL        VARCHAR2 (50 CHAR) NOT NULL ,
    NOME_PAI            VARCHAR2 (80 CHAR) ,
    NOME_MAE            VARCHAR2 (80 CHAR) NOT NULL ,
    NOME_CONJUGE        VARCHAR2 (80 CHAR) ,
    EMAIL               VARCHAR2 (80 CHAR) ,
    CARGO_ID  INTEGER NOT NULL ,
    ESTADO_ID INTEGER NOT NULL
  ) ;
ALTER TABLE TB_MOTORISTA ADD CONSTRAINT PK_MOTORISTA PRIMARY KEY ( PK_MOTORISTA ) ;

ALTER TABLE TB_MOTORISTA ADD CONSTRAINT CARGO_IDFOREIGN KEY ( PK_MOTORISTA ) REFERENCES TB_CARGO_MOTORISTA ( PK_CARGO_MOTORISTA ) ;
ALTER TABLE TB_MOTORISTA ADD CONSTRAINT ESTADO_ID FOREIGN KEY ( PK_MOTORISTA ) REFERENCES TB_ESTADO_MOTORISTA ( PK_ESTADO_MOTORISTA ) ;

Eu primeiro estou inserindo dados nas tabelas TB_CARGO_MOTORISTA e TB_ESTADO_MOTORISTA. Logo em seguida tento inserir os dados na TB_MOTORISTA com as respectivas chaves referenciando o cargo e o estado.

Assim:

INSERT INTO "SISTRAN_DEV"."TB_CARGO_MOTORISTA" (CARGO, REMUNERACAO) VALUES ('44H', '11223')

INSERT INTO "SISTRAN_DEV"."TB_ESTADO_MOTORISTA" (ESTADO) VALUES ('Inativo')

E em seguida uso os IDs gerados para inserir os dados na tabela TB_MOTORISTA:

INSERT INTO "SISTRAN_DEV"."TB_MOTORISTA" (NOME, MATRICULA, DATA_ADMISSAO, TITULO_ELEITOR, CPF, IDENTIDADE, ORGAO_EMISSOR_ID, PIS_PASEP, ESCOLARIDADE, CARTEIRA_TRABALHO, DATA_EMISSAO_CT, NATURALIDADE, ESTADO_CIVIL, NOME_PAI, NOME_MAE, NOME_CONJUGE, EMAIL, CARGO_ID, ESTADO_ID) VALUES ('asdsa', '12321', TO_DATE('2017-04-26 18:12:47', 'YYYY-MM-DD HH24:MI:SS'), '12321321', '1232131', '12321321', 'asdsa', '12312321', 'asdasda', 'asdsa', TO_DATE('2017-04-26 18:12:58', 'YYYY-MM-DD HH24:MI:SS'), 'asdsa', 'asdsa', 'asdsa', 'asdsa', 'asdsad', 'asdasda', '51', '49')

Só que ao tentar inserir esses dados tenho o seguinte erro:

ORA-02291: integrity constraint (SISTRAN_DEV.FK_CARGO_MOTORISTA) violated - parent key not found

Pelo que eu pesquisei, isso acontece porque os dados inseridos da FK não correspondem aos dados na tabela referenciada.
Mas isso não deveria acontecer se eu acabei de inserir esses dados nas tabelas CARGO, certo? Inclusive já tentei inserir fazendo um select e recuperando o id existente na tabela CARGO, mas continuo com o mesmo erro.

Eu vi que é um problema bem simples, mas sinceramente não consegui entender o que está errado. Tenho pouca experiência com banco de dados, então qualquer ajuda já seria de grande valia.

Bem, pelo código que postou, você está definindo suas foreign key assim:

ALTER TABLE TB_MOTORISTA ADD CONSTRAINT CARGO_IDFOREIGN KEY ( PK_MOTORISTA ) REFERENCES TB_CARGO_MOTORISTA ( PK_CARGO_MOTORISTA ) ;
ALTER TABLE TB_MOTORISTA ADD CONSTRAINT ESTADO_ID FOREIGN KEY ( PK_MOTORISTA ) REFERENCES TB_ESTADO_MOTORISTA ( PK_ESTADO_MOTORISTA ) ;

Ao invés de referenciar PK_MOTORISTA aqui, você deveria referenciar CARGO_ID e ESTADO_ID.
Do jeito que está, o id do motorista teria que existir como um cargo e um estado.

1 curtida

BINGO! Deu certo! Muito obrigada! =D