Pergunta

Eu tenho duas tabelas (renomeado / reformulado para fins ilustrativos) com um muitos-para-muitos relação em um banco de dados HSQL. Eu quero que tudo seja apagado quando eu apagar de um lado de uma relação muitos-para-muitos (sem consultar a tabela, isto é desempenho crítico)

Aqui estão as minhas principais tabelas:

CREATE TABLE PERSON
(
    PERSON_ID INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, 
    NAME VARCHAR(50)
)

CREATE TABLE JOB
(
    JOB_ID INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, 
    NAME VARCHAR(50)
)

Aqui está a minha tabela de junção:

CREATE TABLE JOB_PERSON
(
    PERSON_ID INTEGER, 
    JOB_ID INTEGER
)

Aqui estão as minhas restrições:

ALTER TABLE JOB_PERSON ADD 
    CONSTRAINT FK_PERSON_JOB FOREIGN KEY(PERSON_ID) 
    REFERENCES PERSON ON DELETE CASCADE ON UPDATE CASCADE 

ALTER TABLE JOB_PERSON ADD
    CONSTRAINT FK_JOB_PERSON FOREIGN KEY(JOB_ID) 
    REFERENCES JOB ON DELETE CASCADE ON UPDATE CASCADE

Basicamente, eu quero fazer isso: "apagar da pessoa, onde person_id = 0" e tê-lo apagar tudo de pessoa, JOB_PERSON e trabalho, se a entidade trabalho será órfã (não referenciado no muitos para muitos tabela)

Isso é possível sem consultar o banco de dados? Quando eu excluir, mas são excluídos de pessoa e JOB_PERSON. Como você provavelmente pode dizer, minhas habilidades SQL são faltando.

Aqui está os dados fictícios Eu tenho jogado ao redor com:

insert into person values(null,'Arthur');
insert into person values(null,'James');
insert into job values(null, 'Programmer')
insert into job values(null, 'Manager')
insert into job_person values(0,0);
insert into job_person values(0,1);
insert into job_person values(1,1);

Então, se eu entrar ambas as afirmações:

delete from person where person_id=0
delete from person where person_id=1

Eu gostaria de ter tudo em todos os 3 tabelas eliminadas. Possível?

Foi útil?

Solução

Crie uma loja Procedimento onde você passar o ID, então simplesmente excluir a linha adequada na ordem que você precisa.

Desta forma, a sua aplicação não está vinculado a ordem exata, o que pode mudar no futuro com redesenha DB. Você também ganha a vantagem adicional de que Procs armazenados são mais rápido, então o envio de um grande número de consultas.

Embora se você absolutamente queria uma maneira de excluir as tabelas dependentes quando você tenta excluir essa entrada, você tem que gatilhos de uso, mas a regra para os gatilhos são, evitá-los sempre que possível, se uma outra solução existe, usá-lo. Então, finalmente, usando um Proc é a melhor solução.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top