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

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…

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.

[code]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; [/code]

[code]
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; [/code]

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

Tutorial Cascade

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

[quote=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.

[code]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; [/code]

[code]
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; [/code]

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[/quote]

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?

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?

[quote=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?[/quote]

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.

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

;]

[quote=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

;]
[/quote]

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.

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

[quote=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[/quote]

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?

[code]//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 [/code]

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

[quote=charleston10][code]//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 [/code]

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[/quote]

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

Obrigado pela ajuda charleston10.

Posta ai sua solução…

:]