Ajuda com SQL - Alteração de Chave Primaria

3 respostas
S

Olá pessoal tudo bem?
vim pedir ajuda novamente

possuo uma aplicação trabalhando com tabelas semelhantes a estas:

CREATE TABLE FUNCIONARIO(
    MATRICULA INTEGER PRIMARY KEY
    ,NOME VARCHAR
    ,EMAIL VARCHAR UNIQUE
);

CREATE TABLE SALA(
    NOME VARCHAR PRIMARY KEY
    ,DESCRICAO VARCHAR
    ,FK_MATRICULA INTEGER
    ,FOREIGN KEY (FK_MATRICULA) REFERENCES FUNCIONARIO(MATRICULA)
);

no momento tudo ocorre bem.

mas, a aplicação trabalha diretamente com a tabela de cargo

se eu alterar a sala (mais especificamente a chave estrangeira, eu altero a pessoal responsavel por ela (desde que ela exista obviamente, na tabela de funcionarios).

mas, se por um acaso eu altero diretamente na tabela de funcionarios (a matricula) e há uma referencia dele na tabela sala ele me retorna um erro referente a esse problema.

como faço para que as alterações feitas na tabela de funcionario também modifique as referencias que são feitas a ela?

3 Respostas

E

tem que alterar a foreign key da tabela sala:

primeira ‘dropa’ a constraint:

ALTER TABLE SALA
    DROP CONSTRAINT nomedafk

adiciona a fk alterada:

ALTER TABLE SALA
    ADD CONSTRAINT nomedafk FOREIGN KEY (coluna)
        REFERENCES FUNCIONARIO (coluna)
        ON UPDATE CASCADE

a opção ON UPDATE CASCADE faz que toda alteração na matrícula seja refletida aos registros relacionados

S

muito obrigado pela ajuda.

o resultado ficou assim:

CREATE TABLE FUNCIONARIO(
    MATRICULA INTEGER PRIMARY KEY
    ,NOME VARCHAR
    ,EMAIL VARCHAR UNIQUE
);

CREATE TABLE SALA(
    NOME VARCHAR PRIMARY KEY
    ,DESCRICAO VARCHAR
    ,FK_MATRICULA INTEGER
    ,FOREIGN KEY (FK_MATRICULA)
        REFERENCES FUNCIONARIO(MATRICULA)
            ON DELETE NO ACTION
            ON UPDATE CASCADE
);
E

só uma dica: é considerada boa prática nomear suas constrainsts (pk, fk, etc…)… torna o trabalho de adm/manutenção mais simples…

até mais…

edu…

Criado 25 de setembro de 2010
Ultima resposta 25 de set. de 2010
Respostas 3
Participantes 2