Discussion:
[pgbr-geral] Delete ou Update em dois registros identicos
Edelson Regis de Lima
2017-10-16 15:03:47 UTC
Permalink
Olá pessoal.

To com um problema que não sei se tem solução...

Tem um cliente que tem um banco de dados com uma tabela com dois registros
identicos, e preciso dar um update ou um delete em um dos registros, porém
como todos os campos são iguais, ainda não achei uma solução.

Exmplo: tenho a minha_tabela, com as colunas col_a e col_b. Nessa tabela
tem dois registros identicos:

col_a | col_B

aaa | bbb

aaa | bbb

Eu gostaria de apagar a linha dois por exemplo, ou dar um update mudando as
informações para ccc | ddd.

Já vi o uso do ROW_NUMBER () OVER (ORDER BY id), porém só achei exemplos
que funcionasse com o SELECT.

Já tentei:

UPDATE minha_tabela SET col_a = 'ccc', col_b = 'ddd' where col_a = 'aaa'
and col_b = 'bbb' and ROW_NUMBER () OVER (ORDER BY id) = 2;

Porém dá: ERROR: cannot use window function in UPDATE

Alguém teria uma solução?

Agradeço desde já!
--
*Edelson Regis de Lima*
Flavio Henrique Araque Gurgel
2017-10-16 15:14:16 UTC
Permalink
Post by Edelson Regis de Lima
Olá pessoal.
To com um problema que não sei se tem solução...
Tem um cliente que tem um banco de dados com uma tabela com dois registros
identicos, e preciso dar um update ou um delete em um dos registros, porém
como todos os campos são iguais, ainda não achei uma solução.
Exmplo: tenho a minha_tabela, com as colunas col_a e col_b. Nessa tabela
col_a | col_B
aaa | bbb
aaa | bbb
Eu gostaria de apagar a linha dois por exemplo, ou dar um update mudando
as informações para ccc | ddd.
Já vi o uso do ROW_NUMBER () OVER (ORDER BY id), porém só achei exemplos
que funcionasse com o SELECT.
UPDATE minha_tabela SET col_a = 'ccc', col_b = 'ddd' where col_a = 'aaa'
and col_b = 'bbb' and ROW_NUMBER () OVER (ORDER BY id) = 2;
Porém dá: ERROR: cannot use window function in UPDATE
Alguém teria uma solução?
Tente com uma CTE:

WITH results_to_delete AS
( SELECT max(id) AS id_to_delete, col_a, col_b FROM sua_tabela HAVING
count(id) > 1 GROUP BY 2, 3)
DELETE FROM sua_tabela USING results_to_delete WHERE id = id_to_delete;

Note que não testei isto, então, pode ter erro de sintaxe ou mesmo de
semântica se não entendi bem seu problema.
Teste antes numa cópia do banco de dados ou da tabela, ou utilise uma
transação para que possa fazer rollback em caso de erro.

[]s
Flavio Gurgel
Flavio Henrique Araque Gurgel
2017-10-16 15:15:30 UTC
Permalink
Em seg, 16 de out de 2017 às 17:14, Flavio Henrique Araque Gurgel <
Em seg, 16 de out de 2017 às 17:03, Edelson Regis de Lima <
Post by Edelson Regis de Lima
Olá pessoal.
To com um problema que não sei se tem solução...
Tem um cliente que tem um banco de dados com uma tabela com dois
registros identicos, e preciso dar um update ou um delete em um dos
registros, porém como todos os campos são iguais, ainda não achei uma
solução.
Exmplo: tenho a minha_tabela, com as colunas col_a e col_b. Nessa tabela
col_a | col_B
aaa | bbb
aaa | bbb
Eu gostaria de apagar a linha dois por exemplo, ou dar um update mudando
as informações para ccc | ddd.
Já vi o uso do ROW_NUMBER () OVER (ORDER BY id), porém só achei exemplos
que funcionasse com o SELECT.
UPDATE minha_tabela SET col_a = 'ccc', col_b = 'ddd' where col_a = 'aaa'
and col_b = 'bbb' and ROW_NUMBER () OVER (ORDER BY id) = 2;
Porém dá: ERROR: cannot use window function in UPDATE
Alguém teria uma solução?
WITH results_to_delete AS
( SELECT max(id) AS id_to_delete, col_a, col_b FROM sua_tabela HAVING
count(id) > 1 GROUP BY 2, 3)
DELETE FROM sua_tabela USING results_to_delete WHERE id = id_to_delete;
Esqueci de dizer, você pode mudar a parte do DELETE para UPDATE se
preferir, tente re-escrever com a lógica que deseja.

[]s
Flavio Gurgel
Edelson Regis de Lima
2017-10-16 17:32:22 UTC
Permalink
Olá Flávio.

Mas com esse exemplo você está supondo que na tabela exista o campo "id"
que seria uma chave única, correto?
O problema é que nessa tabela que mencionei não sei porque raios não existe
essa chave única. Tem um campo id, auto incremento, que seria essa chave
única, mas não sei como o sistema conseguiu inserir dois registros
identicos, inclusive o valor do id...
Então eu teria que ver se dá para identificar de outra maneira, pela
posição física do registro, sei lá...
Não sei se isso é possível... rs
--
*Edelson Regis de Lima*


Em 16 de outubro de 2017 12:14, Flavio Henrique Araque Gurgel <
Em seg, 16 de out de 2017 às 17:03, Edelson Regis de Lima <
Post by Edelson Regis de Lima
Olá pessoal.
To com um problema que não sei se tem solução...
Tem um cliente que tem um banco de dados com uma tabela com dois
registros identicos, e preciso dar um update ou um delete em um dos
registros, porém como todos os campos são iguais, ainda não achei uma
solução.
Exmplo: tenho a minha_tabela, com as colunas col_a e col_b. Nessa tabela
col_a | col_B
aaa | bbb
aaa | bbb
Eu gostaria de apagar a linha dois por exemplo, ou dar um update mudando
as informações para ccc | ddd.
Já vi o uso do ROW_NUMBER () OVER (ORDER BY id), porém só achei exemplos
que funcionasse com o SELECT.
UPDATE minha_tabela SET col_a = 'ccc', col_b = 'ddd' where col_a = 'aaa'
and col_b = 'bbb' and ROW_NUMBER () OVER (ORDER BY id) = 2;
Porém dá: ERROR: cannot use window function in UPDATE
Alguém teria uma solução?
WITH results_to_delete AS
( SELECT max(id) AS id_to_delete, col_a, col_b FROM sua_tabela HAVING
count(id) > 1 GROUP BY 2, 3)
DELETE FROM sua_tabela USING results_to_delete WHERE id = id_to_delete;
Note que não testei isto, então, pode ter erro de sintaxe ou mesmo de
semântica se não entendi bem seu problema.
Teste antes numa cópia do banco de dados ou da tabela, ou utilise uma
transação para que possa fazer rollback em caso de erro.
[]s
Flavio Gurgel
_______________________________________________
pgbr-geral mailing list
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Danilo Silva
2017-10-16 17:51:19 UTC
Permalink
Danilo Gomes
Post by Edelson Regis de Lima
Olá Flávio.
Mas com esse exemplo você está supondo que na tabela exista o campo "id"
que seria uma chave única, correto?
O problema é que nessa tabela que mencionei não sei porque raios não
existe essa chave única. Tem um campo id, auto incremento, que seria essa
chave única, mas não sei como o sistema conseguiu inserir dois registros
identicos, inclusive o valor do id...
Então eu teria que ver se dá para identificar de outra maneira, pela
posição física do registro, sei lá...
Não sei se isso é possível... rs
a) se a tabela possuir o campo OID (essa coluna normalmente fica invisível,
depende do método de criação da tabela), você pode deletar por esse
registro, exemplo: SELECT OID, col_a,
col_
​b FROM tabela, e depois deletar: DELETE FROM tabela WHERE (OID = ?)

b) se a tabela não for muito grande, você pode adicionar uma nova coluna
com ​
​

​o tipo sendo serial: ALTER TABLE tabela ADD COLUMN cod_delete serial. Com
isso você consegue deletar através do código dessa coluna.

[]s
Danilo​
Michel Luiz Milezzi
2017-10-16 18:01:46 UTC
Permalink
Edelson, neste caso você deve usar a localização física dos registros
(coluna implícita ctid).

https://www.postgresql.org/docs/current/static/ddl-system-columns.html
Post by Danilo Silva
Danilo Gomes
Post by Edelson Regis de Lima
Olá Flávio.
Mas com esse exemplo você está supondo que na tabela exista o campo "id"
que seria uma chave única, correto?
O problema é que nessa tabela que mencionei não sei porque raios não
existe essa chave única. Tem um campo id, auto incremento, que seria essa
chave única, mas não sei como o sistema conseguiu inserir dois registros
identicos, inclusive o valor do id...
Então eu teria que ver se dá para identificar de outra maneira, pela
posição física do registro, sei lá...
Não sei se isso é possível... rs
a) se a tabela possuir o campo OID (essa coluna normalmente fica
invisível, depende do método de criação da tabela), você pode deletar por
esse registro, exemplo: SELECT OID, col_a,
col_
​b FROM tabela, e depois deletar: DELETE FROM tabela WHERE (OID = ?)
b) se a tabela não for muito grande, você pode adicionar uma nova coluna
com ​
​
​o tipo sendo serial: ALTER TABLE tabela ADD COLUMN cod_delete serial. Com
isso você consegue deletar através do código dessa coluna.
[]s
Danilo​
_______________________________________________
pgbr-geral mailing list
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Edelson Regis de Lima
2017-10-17 13:17:28 UTC
Permalink
Obrigado pessoal!
Obrigado a todos pela ajuda!

Grande abraço!
--
*Edelson Regis de Lima*
Post by Michel Luiz Milezzi
Edelson, neste caso você deve usar a localização física dos registros
(coluna implícita ctid).
https://www.postgresql.org/docs/current/static/ddl-system-columns.html
Post by Danilo Silva
Danilo Gomes
Post by Edelson Regis de Lima
Olá Flávio.
Mas com esse exemplo você está supondo que na tabela exista o campo "id"
que seria uma chave única, correto?
O problema é que nessa tabela que mencionei não sei porque raios não
existe essa chave única. Tem um campo id, auto incremento, que seria essa
chave única, mas não sei como o sistema conseguiu inserir dois registros
identicos, inclusive o valor do id...
Então eu teria que ver se dá para identificar de outra maneira, pela
posição física do registro, sei lá...
Não sei se isso é possível... rs
a) se a tabela possuir o campo OID (essa coluna normalmente fica
invisível, depende do método de criação da tabela), você pode deletar por
esse registro, exemplo: SELECT OID, col_a,
col_
​b FROM tabela, e depois deletar: DELETE FROM tabela WHERE (OID = ?)
b) se a tabela não for muito grande, você pode adicionar uma nova coluna
com ​
​
​o tipo sendo serial: ALTER TABLE tabela ADD COLUMN cod_delete serial.
Com isso você consegue deletar através do código dessa coluna.
[]s
Danilo​
_______________________________________________
pgbr-geral mailing list
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
_______________________________________________
pgbr-geral mailing list
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Luiz Carlos L. Nogueira Jr.
2017-10-23 14:59:57 UTC
Permalink
Fazer um update com limit 1 não funcionaria?
Post by Edelson Regis de Lima
Obrigado pessoal!
Obrigado a todos pela ajuda!
Grande abraço!
--
*Edelson Regis de Lima*
Em 16 de outubro de 2017 15:01, Michel Luiz Milezzi <
Post by Michel Luiz Milezzi
Edelson, neste caso você deve usar a localização física dos registros
(coluna implícita ctid).
https://www.postgresql.org/docs/current/static/ddl-system-columns.html
Post by Danilo Silva
Danilo Gomes
Post by Edelson Regis de Lima
Olá Flávio.
Mas com esse exemplo você está supondo que na tabela exista o campo
"id" que seria uma chave única, correto?
O problema é que nessa tabela que mencionei não sei porque raios não
existe essa chave única. Tem um campo id, auto incremento, que seria essa
chave única, mas não sei como o sistema conseguiu inserir dois registros
identicos, inclusive o valor do id...
Então eu teria que ver se dá para identificar de outra maneira, pela
posição física do registro, sei lá...
Não sei se isso é possível... rs
a) se a tabela possuir o campo OID (essa coluna normalmente fica
invisível, depende do método de criação da tabela), você pode deletar por
esse registro, exemplo: SELECT OID, col_a,
col_
​b FROM tabela, e depois deletar: DELETE FROM tabela WHERE (OID = ?)
b) se a tabela não for muito grande, você pode adicionar uma nova coluna
com ​
​
​o tipo sendo serial: ALTER TABLE tabela ADD COLUMN cod_delete serial.
Com isso você consegue deletar através do código dessa coluna.
[]s
Danilo​
_______________________________________________
pgbr-geral mailing list
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
_______________________________________________
pgbr-geral mailing list
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
_______________________________________________
pgbr-geral mailing list
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Fábio Telles Rodriguez
2017-10-23 16:34:16 UTC
Permalink
Em 23 de outubro de 2017 12:59, Luiz Carlos L. Nogueira Jr. <
Post by Luiz Carlos L. Nogueira Jr.
Fazer um update com limit 1 não funcionaria?
O LIMIT se aplica ao SELECT, a condição do UPDATE vem pelo WHERE. Você tem
que fazer algo assim:

SELECT *ctid, ** FROM tabela;

UPDATE tabela SET ... WHERE *ctid = ( xxx, yyy)::tid*


Onde xxx e yyy são o par de números exibidos no ctid que você recebeu no
seu SELECT.
Post by Luiz Carlos L. Nogueira Jr.
Post by Edelson Regis de Lima
Obrigado pessoal!
Obrigado a todos pela ajuda!
Grande abraço!
--
*Edelson Regis de Lima*
Em 16 de outubro de 2017 15:01, Michel Luiz Milezzi <
Post by Michel Luiz Milezzi
Edelson, neste caso você deve usar a localização física dos registros
(coluna implícita ctid).
https://www.postgresql.org/docs/current/static/ddl-system-columns.html
Post by Danilo Silva
Danilo Gomes
Em 16 de outubro de 2017 15:32, Edelson Regis de Lima <
Post by Edelson Regis de Lima
Olá Flávio.
Mas com esse exemplo você está supondo que na tabela exista o campo
"id" que seria uma chave única, correto?
O problema é que nessa tabela que mencionei não sei porque raios não
existe essa chave única. Tem um campo id, auto incremento, que seria essa
chave única, mas não sei como o sistema conseguiu inserir dois registros
identicos, inclusive o valor do id...
Então eu teria que ver se dá para identificar de outra maneira, pela
posição física do registro, sei lá...
Não sei se isso é possível... rs
a) se a tabela possuir o campo OID (essa coluna normalmente fica
invisível, depende do método de criação da tabela), você pode deletar por
esse registro, exemplo: SELECT OID, col_a,
col_
​b FROM tabela, e depois deletar: DELETE FROM tabela WHERE (OID = ?)
b) se a tabela não for muito grande, você pode adicionar uma nova
coluna com ​
​
​o tipo sendo serial: ALTER TABLE tabela ADD COLUMN cod_delete serial.
Com isso você consegue deletar através do código dessa coluna.
[]s
Danilo​
_______________________________________________
pgbr-geral mailing list
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
_______________________________________________
pgbr-geral mailing list
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
_______________________________________________
pgbr-geral mailing list
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
_______________________________________________
pgbr-geral mailing list
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
--
Atenciosamente,
Fábio Telles Rodriguez
blog: http:// <http://www.midstorm.org/~telles/>s
<http://tellesr.wordpress.com/>avepoint.blog.br
e-mail / gtalk / MSN: ***@gmail.com
Skype: fabio_telles

Timbira - A empresa brasileira de Postgres
http://www.timbira.com.br
Fábio Telles Rodriguez
2017-10-23 17:48:48 UTC
Permalink
Veja se assim fica claro:

http://www.savepoint.blog.br/2017/10/23/removendo-registros-identicos-no-postgresql/
Post by Edelson Regis de Lima
Olá pessoal.
To com um problema que não sei se tem solução...
Tem um cliente que tem um banco de dados com uma tabela com dois registros
identicos, e preciso dar um update ou um delete em um dos registros, porém
como todos os campos são iguais, ainda não achei uma solução.
Exmplo: tenho a minha_tabela, com as colunas col_a e col_b. Nessa tabela
col_a | col_B
aaa | bbb
aaa | bbb
Eu gostaria de apagar a linha dois por exemplo, ou dar um update mudando
as informações para ccc | ddd.
Já vi o uso do ROW_NUMBER () OVER (ORDER BY id), porém só achei exemplos
que funcionasse com o SELECT.
UPDATE minha_tabela SET col_a = 'ccc', col_b = 'ddd' where col_a = 'aaa'
and col_b = 'bbb' and ROW_NUMBER () OVER (ORDER BY id) = 2;
Porém dá: ERROR: cannot use window function in UPDATE
Alguém teria uma solução?
Agradeço desde já!
--
*Edelson Regis de Lima*
_______________________________________________
pgbr-geral mailing list
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
--
Atenciosamente,
Fábio Telles Rodriguez
blog: http:// <http://www.midstorm.org/~telles/>s
<http://tellesr.wordpress.com/>avepoint.blog.br
e-mail / gtalk / MSN: ***@gmail.com
Skype: fabio_telles

Timbira - A empresa brasileira de Postgres
http://www.timbira.com.br
Edelson Regis de Lima
2017-10-23 17:59:45 UTC
Permalink
Isso mesmo Fábio, resolvi com o CTID!

Valew pessoal!

Edelson

Em 23 de outubro de 2017 14:48, Fábio Telles Rodriguez <
Post by Fábio Telles Rodriguez
http://www.savepoint.blog.br/2017/10/23/removendo-registros-identicos-no-
postgresql/
Post by Edelson Regis de Lima
Olá pessoal.
To com um problema que não sei se tem solução...
Tem um cliente que tem um banco de dados com uma tabela com dois
registros identicos, e preciso dar um update ou um delete em um dos
registros, porém como todos os campos são iguais, ainda não achei uma
solução.
Exmplo: tenho a minha_tabela, com as colunas col_a e col_b. Nessa tabela
col_a | col_B
aaa | bbb
aaa | bbb
Eu gostaria de apagar a linha dois por exemplo, ou dar um update mudando
as informações para ccc | ddd.
Já vi o uso do ROW_NUMBER () OVER (ORDER BY id), porém só achei exemplos
que funcionasse com o SELECT.
UPDATE minha_tabela SET col_a = 'ccc', col_b = 'ddd' where col_a = 'aaa'
and col_b = 'bbb' and ROW_NUMBER () OVER (ORDER BY id) = 2;
Porém dá: ERROR: cannot use window function in UPDATE
Alguém teria uma solução?
Agradeço desde já!
--
*Edelson Regis de Lima*
_______________________________________________
pgbr-geral mailing list
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
--
Atenciosamente,
Fábio Telles Rodriguez
blog: http:// <http://www.midstorm.org/~telles/>s
<http://tellesr.wordpress.com/>avepoint.blog.br
Skype: fabio_telles
Timbira - A empresa brasileira de Postgres
http://www.timbira.com.br
_______________________________________________
pgbr-geral mailing list
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Loading...