Deletar duas tabelas onde o código é o mesmo usando postgresql

12 respostas
E

Olá , queria deletar duas tabelas onde certo codigo é igual…

Exemplo:

create table endereco(
cod_endereco serial primary key,
endereco varchar
)

create table motorista(
cod_motorista serial primary key,
nome_motorista varchar,
cod_endereco integer)

onde tem a foreign key cod_endereco em motorista, o codigo teria que ser igual a cod_endereco em endereco…

Ai queria apagar os dados das duas tabelas que no caso é endereco e motorista de uma vez quando o cod_endereco são iguais.

Procurei por cascade mas no meu caso só deleta a tabela motorista e deixa a tabela endereço sem ser deletada…

12 Respostas

charleston10

O Cascade só vai funcionar se você fez essa relação dos campos.
Mas, funciona sim, eu trabalho com postgres aqui na empresa.

Não está funcionando pq vc criou a tabela de modo errado.

view plaincopy to clipboardprint?
CREATE TABLE endereco  
(  
    
cod_endereco not null primary key,   
endereco text  
CONSTRAINT cod_endereco_pkey PRIMARY KEY (cod_endereco)  
  
)  
WITH (  
  
OIDS=FALSE  
);  
  
ALTER TABLE endereco   
   OWNER TO postgres;
view plaincopy to clipboardprint?
CREATE TABLE motorista  
(  
cod_motorista not null primary key,   
nome_motorista text,   
cod_endereco integer  
  
  CONSTRAINT fk_cod_endereco FOREIGN KEY (cod_endereco)  
      REFERENCES endereco (cod_endereco) MATCH SIMPLE  
      ON UPDATE NO ACTION ON DELETE CASCADE    
)  
WITH (  
  OIDS=FALSE  
);  
ALTER TABLE motorista  
  OWNER TO postgres;

Criei um cascade onde se o endereco for deletado, tambem sera deletado na tabela motorista

Tutorial Cascade
http://javaaberto.blogspot.com.br/2012/10/usando-cascade-no-banco-de-dados.html

Hebert_Coelho

Se você estiver usando JPA/Hibernate realmente existem modos para realizar um delete.

Colocando a entidade para null é um dos modos.

Nesse post mostra como realizar um delete ou utilizar corretamente o cascade ou o orphamRemoval: JPA: Mini Livro - Primeiros passos e conceitos detalhados

E
charleston10:
O Cascade só vai funcionar se você fez essa relação dos campos. Mas, funciona sim, eu trabalho com postgres aqui na empresa.

Não está funcionando pq vc criou a tabela de modo errado.

view plaincopy to clipboardprint?
CREATE TABLE endereco  
(  
    
cod_endereco not null primary key,   
endereco text  
CONSTRAINT cod_endereco_pkey PRIMARY KEY (cod_endereco)  
  
)  
WITH (  
  
OIDS=FALSE  
);  
  
ALTER TABLE endereco   
   OWNER TO postgres;
view plaincopy to clipboardprint?
CREATE TABLE motorista  
(  
cod_motorista not null primary key,   
nome_motorista text,   
cod_endereco integer  
  
  CONSTRAINT fk_cod_endereco FOREIGN KEY (cod_endereco)  
      REFERENCES endereco (cod_endereco) MATCH SIMPLE  
      ON UPDATE NO ACTION ON DELETE CASCADE    
)  
WITH (  
  OIDS=FALSE  
);  
ALTER TABLE motorista  
  OWNER TO postgres;

Criei um cascade onde se o endereco for deletado, tambem sera deletado na tabela motorista

Tutorial Cascade
http://javaaberto.blogspot.com.br/2012/10/usando-cascade-no-banco-de-dados.html

olá amigo, o problema é esse aqui:

se o endereço for deletado tudo será deletado sim, mas o que eu quero é que quando o motorista for deletado o endereço também suma. Seria ao contrario do que está acontecendo, porque não tem nenhum valor que eu possa pegar como base pra buscar o motorista, entao eu estou usando:

delete from motorista where nome_motorista=?

teria alguma outra solução para isto?

charleston10

Esclarece uma dúvida, então cada endereço está relacionado a um motorista, ou seja, cada motorista tem somente um endereço?
Se assim for, se o motorista não existir, aquele endereço não existe…

seria isso mesmo?

E

charleston10:
Esclarece uma dúvida, então cada endereço está relacionado a um motorista, ou seja, cada motorista tem somente um endereço?
Se assim for, se o motorista não existir, aquele endereço não existe…

seria isso mesmo?

sim, isso mesmo.

Se o endereço não existir o motorista que está ligado a aquele também não existe e vice-versa.

charleston10

Oxi, então cria um campo de identificação do motorista na tabela endereço e relaciona como chave estrangeira esse campo…
então vc usa cascade na refenrecia

;]

E

charleston10:
Oxi, então cria um campo de identificação do motorista na tabela endereço e relaciona como chave estrangeira esse campo…
então vc usa cascade na refenrecia

;]

olá, entendi mais ou menos o que voce falou, mas como seria isso falandoo em termos de codigo? como seria essa consulta?

Lembrando que busco o campo usando o nome_motorista.

charleston10

Errado

Vc nao pode fazer isso, pq qual campo que identifica o motorista, o codigo dele ou o nome dele?
Se for o nome, entao vc tem que concordar que pode ter nomes iguais, e ai vai da erro… pq nomes iguais com endereços diferentes…

Em termos de código, vc adiciona um campo na tabela endereço com o nome codigo_motorista
pra vc fazer essa relaçao…

http://javaaberto.blogspot.com.br/2012/10/usando-cascade-no-banco-de-dados.html

Na consulta vc vai ter que usar Inner Join para juncionar duas tabelas com um resultado

http://javaaberto.blogspot.com.br/2012/10/sql-cross-inner-left-right-e-full-outer.html

E

charleston10:
Errado

Vc nao pode fazer isso, pq qual campo que identifica o motorista, o codigo dele ou o nome dele?
Se for o nome, entao vc tem que concordar que pode ter nomes iguais, e ai vai da erro… pq nomes iguais com endereços diferentes…

Em termos de código, vc adiciona um campo na tabela endereço com o nome codigo_motorista
pra vc fazer essa relaçao…

http://javaaberto.blogspot.com.br/2012/10/usando-cascade-no-banco-de-dados.html

Na consulta vc vai ter que usar Inner Join para juncionar duas tabelas com um resultado

http://javaaberto.blogspot.com.br/2012/10/sql-cross-inner-left-right-e-full-outer.html

não se preocupe com os dados, ja to pensando em outra forma de buscar, mas o meu problema é justamente isso, seria tipo uma consulta e um delete no mesmo tempo.

porque preciso que seja um select e um delete junto, e sendo assim se fosse fazer com essa referência que você falou teria que pensar ja na parte de programação pra pegar o valor do cod motorista e adicionar na tabela endereco e queria que só fosse em sql por ser mais simples…

ficaria algo assim: select * from motorista m inner join endereco e on (m.cod_motorista=e.cod_motorista) where m.cod_motorista=?

mas e o delete?

charleston10
//mostra todos os dados do motorista juntamente com o endereço
SELECT * FROM motorista m
INNER JOIN endereco e
ON e.codigo_endereco = m.codigo_endereco
WHERE m.codigo_motorista = 1

//automaticamente o endereço sera deletado
DELETE FROM motorista WHERE codigo_motorista = 1

Quando voce trabalha com relacionamento de tabelas, os SQLs são simples, é que parecem ser complicados, mas só vc entender.. é fácil
é q vc nao viu consultas de 900 linhas... hahhah

E
charleston10:
//mostra todos os dados do motorista juntamente com o endereço
SELECT * FROM motorista m
INNER JOIN endereco e
ON e.codigo_endereco = m.codigo_endereco
WHERE m.codigo_motorista = 1

//automaticamente o endereço sera deletado
DELETE FROM motorista WHERE codigo_motorista = 1

Quando voce trabalha com relacionamento de tabelas, os SQLs são simples, é que parecem ser complicados, mas só vc entender.. é fácil
é q vc nao viu consultas de 900 linhas... hahhah

olá, resolvi o problema apesar de ter usado uma solução diferente.

Obrigado pela ajuda charleston10.

charleston10

Posta ai sua solução…

:]

Criado 9 de novembro de 2012
Ultima resposta 10 de nov. de 2012
Respostas 12
Participantes 3