Re: [pgbr-geral] Delete ou Update em dois registros identicos
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 Em 16 de outubro de 2017 15:51, Danilo Silvaescreveu: > > > Danilo Gomes > > Em 16 de outubro de 2017 15:32, Edelson Regis de Lima > escreveu: > >> 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 >> >> Você tem duas opções: > 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 > pgbr-geral@listas.postgresql.org.br > https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral > ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Delete ou Update em dois registros identicos
Danilo Gomes Em 16 de outubro de 2017 15:32, Edelson Regis de Limaescreveu: > 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 > > Você tem duas opções: 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 pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Delete ou Update em dois registros identicos
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 < fha...@gmail.com> escreveu: > > > Em seg, 16 de out de 2017 às 17:03, Edelson Regis de Lima < > edre...@gmail.com> escreveu: > >> 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? >> > 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 > > > ___ > pgbr-geral mailing list > pgbr-geral@listas.postgresql.org.br > https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral > ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Delete ou Update em dois registros identicos
Em seg, 16 de out de 2017 às 17:14, Flavio Henrique Araque Gurgel < fha...@gmail.com> escreveu: > Em seg, 16 de out de 2017 às 17:03, Edelson Regis de Lima < > edre...@gmail.com> escreveu: > >> 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? >> > 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; > 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 ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Delete ou Update em dois registros identicos
Em seg, 16 de out de 2017 às 17:03, Edelson Regis de Limaescreveu: > 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? > 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 ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
[pgbr-geral] Delete ou Update em dois registros identicos
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* ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral