Discussion:
[PostgreSQL-Brasil] IGNORE
Eli Medeiros Sousa
2006-05-23 01:04:49 UTC
Permalink
Olá pessoal,

Eu estou começando a utilizar o postgres 8.1, gostaria de saber se existe
algo equivalente ao INSERT IGNORE do MySQL. (Tenta Inserir, e se houver erro
por duplicação de chave ele simplesmente ignora o erro).

[ ]’s!!!
Nabucodonosor Coutinho
2006-05-23 01:40:18 UTC
Permalink
Post by Eli Medeiros Sousa
Olá pessoal,
Eu estou começando a utilizar o postgres 8.1, gostaria de saber se
existe algo equivalente ao INSERT IGNORE do MySQL. (Tenta Inserir, e
se houver erro por duplicação de chave ele simplesmente ignora o erro) .
Ignora o erro e faz o que?
Post by Eli Medeiros Sousa
[ ]’s!!!
------------------------------------------------------------------------
_______________________________________________
Grupo de Usuários do PostgreSQL no Brasil
http://www.postgresql.org.br
--
Nabucodonosor Coutinho
"Mais vale um ponteiro na mao do que duas classes voando"
Otacilio Neto
2006-05-23 04:06:54 UTC
Permalink
Post by Eli Medeiros Sousa
Olá pessoal,
Eu estou começando a utilizar o postgres 8.1,
gostaria de saber se existe
algo equivalente ao INSERT IGNORE do MySQL. (Tenta
Inserir, e se houver erro
por duplicação de chave ele simplesmente ignora o
erro).
[ ]’s!!!
Veja, agora eu não conheço nenhuma opção que faça
isso. Mas você pode fazer assim:

tb_pessoa eh uma tabela com dois campos text: rg e
nome, onde rg é chave primária.

Para inserir um registro você pode fazer:

INSERT INTO tb_pessoa
SELECT
'1989994' as rg,
'Otacilio' as nome
WHERE
'1989994' NOT IN (SELECT rg FROM tb_pessoa)

Se você acha o comando acima complicado você pode
criar uma função:

CREATE OR REPLACE FUNCTION
insert_into_tb_pessoa(identidade text, nome_pessoa
text)
RETURNS void AS
$BODY$
INSERT INTO tb_pessoa
SELECT
$1 as rg,
$2 as nome
WHERE
$1 NOT IN (SELECT rg FROM tb_pessoa)$BODY$
LANGUAGE 'sql' VOLATILE;
ALTER FUNCTION insert_into_tb_pessoa(identidade text,
nome_pessoa text) OWNER TO pgsql;


E depois chamar:

SELECT insert_into_tb_pessoa('1989994','Otacílio');
SELECT insert_into_tb_pessoa('1989995','Eli
medeiros');


Chame a função várias vezes ou execute o comando
INSERT INTO tb_pessoa
SELECT
'1989994' as rg,
'Otacilio' as nome
WHERE
'1989994' NOT IN (SELECT rg FROM tb_pessoa)

várias vezes e depois olhe a tabela. Ele só inseriu um
único registro de cada.

Você pode também escrever uma função em plpgsql que
apenas captura o erro de violação de chave primária e
não faz nada quando isto ocorrer. O link abaixo trata
disto:
http://www.postgresql.org/docs/8.1/interactive/plpgsql-control-structures.html#PLPGSQL-ERROR-TRAPPING



_______________________________________________________
Abra sua conta no Yahoo! Mail: 1GB de espaço, alertas de e-mail no celular e anti-spam realmente eficaz.
http://br.info.mail.yahoo.com/
Eli Medeiros Sousa
2006-05-23 13:29:22 UTC
Permalink
Valeu Otacílio, resolveu deu certinho desta forma. Eu preferi fazer com o
SELECT.

Valeu!!!







_______________________________________________________
Yahoo! doce lar. Faça do Yahoo! sua homepage.
http://br.yahoo.com/homepageset.html
Otacilio Neto
2006-05-23 19:06:13 UTC
Permalink
Post by Eli Medeiros Sousa
Valeu Otacílio, resolveu deu certinho desta forma.
Eu preferi fazer com o
SELECT.
Valeu!!!
Só mais uma coisinha, no SELECT rg FROM tb_pessoas
adicinoe um WHERE rg='1989994' (exemplo) pois acho que
vai ficar mais rápido.




_______________________________________________________
Navegue com o Yahoo! Acesso Grátis, assista aos jogos do Brasil na Copa e ganhe prêmios de hora em hora!
http://br.yahoo.com/artilheirodacopa/
Eli Medeiros Sousa
2006-05-24 12:36:36 UTC
Permalink
Olá pessoal,

No caso do exemplo dado de tb_pessoa, como ficaria o tratamento de erro?
Daria para colocar numa trigger? Ou apenas criando uma função que eu a
chamaria para fazer as inserções ao invés de INSERT direto?!

Valeu!!!

Eli Medeiros Sousa
***@moov.com.br

Citando Kamayocks <***@click21.com.br>:

Date: Tue, 23 May 2006 16:54:43 -0300
From: Kamayocks <***@click21.com.br>
Subject: Re: [PostgreSQL-Brasil] RES: Digest Brasil-Usuarios, volume
187, assunto 2
To: brasil-***@pgfoundry.org
Message-ID: <***@webmail7.click21.com.br>
Content-Type: text/plain; charset=ISO-8859-1

A melhor opção não seria enviar a mensagem, capturar e tratar a exceção
quando a
mesma ocorrer?!
Caso contrário seria enviado mensagem para, primeiro verificar a existencia
e
depois, caso não haja a duplicidade, realizar o insert.
Mesmo que a procura seja realizada internamente, não vejo porque rodar um
cursor
para fazer esta verificação, quando o SGDB possui regras de integridade,
unicidade, etc. Por que não os recursos que SGDB oferece?!
Ou eu entendi tudo errado?!
--- "Cristiano Martins ribeiro (Informatica)"
Agora levanto a questão da performance, haveria
muita diferença entre utilizar a trigger de inserção
ou a instrução SQL?
Pense, por exemplo, em um loop com milhares de
inserções...
Cristiano Martins
Eu acho que o bom mesmo eh capturar o erro no lugar de
verificar se o registro já existe.
Pode adicionar tb um WHERE rg='qualquer_coisa' que
acho que melhora, mas o bom mesmo seria capturar o
erra quando desse chave duplicada.
_______________________________________________________
Novo Yahoo! Messenger com voz: Instale agora e faça ligações de graça.
http://br.messenger.yahoo.com/

Continue reading on narkive:
Loading...