Em 10 de outubro de 2011 22:02, Shander Lyrio <[email protected]> escreveu: > Em 10/10/2011 20:08, Tiago Adami escreveu: >> Ok, mas imagine que há outra aplicação conectada ao banco de dados e >> insere um registro. Como o aplicativo (persistência) saberá que o >> objeto existe no banco, mas não na memória? > > Isto é uma limitação da sua aplicação, linguagem, ou de sua escolha do > ORM. > Veja esta query que meu ORM SqlAlchemy gera e que eu postei em mensagem > imediatamente anterior: > > insert into clientes(chaveprimaria, cliente) > values(nextval('chaveprimaria'), ?) returning chaveprimaria; > > Não importa de onde venha a inclusão, nunca haverá repetição de chave > primária nem erro na inserção pois o próprio PostgreSql retornará um > inteiro com o valor da sequence utilizado para persistir o objeto. >
Ok, entendi. Mas isto só se aplica quando você está usando SEQUENCES em chaves primárias - possivelmente artificiais. Isto não funcionaria com chaves naturais, do tipo CHAR ou VARCHAR, por exemplo. Agora começo entender porque os arquitetos de software vivem reclamando quando recuso a criação de chaves artificiais (geralmente colunas com nome "ID" do tipo Integer) só porque "fica mais fácil trabalhar com Hibernate" :) >> Certa vez já tive que fazer _quase_ isso para simular o comando >> "MERGE" de outro SGBD, e não tive outra opção a não ser criar um >> programa que tentasse inserir, e no caso de violação da PK tratava o >> erro em código fazia um UPDATE. > > Merge de um SGDB? Qual SGDB faz merge e como funciona isso? Está > falando de juntar os dados de dois bancos de dados em um único? O que > isto tem haver com ORM? > MERGE do IBM DB2, que faz exatamente o que você quer. Assim como o Osvaldo já mencionou em um post posterior, o Oracle também tem um. Só faltou isso no Elefante... seria ótimo para ETL. -- TIAGO J. ADAMI http://www.adamiworks.com _______________________________________________ pgbr-geral mailing list [email protected] https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
