Insert sem duplicar dados

Firebird

24/07/2012

Eu estou tentando achar um meio simples de inserir dados numa tabela mas que não se repitam caso ja existam.
Tenho uma tabela simples onde para gravar os dados uso o INSERT,VALUES mas caso o dado do campo CODIGOS ja exista,não faça nada,apnas grava dados novos.
Uso o Firebird 2.0.3 com Delphi.
Obrigado a quem puder auxiliar.
Vtrx

Vtrx

Curtidas 0

Respostas

Cleber Campos.

Cleber Campos.

24/07/2012

se for insert por select

tente assim
insert into tabela1(codigo)
select codigo from tabela2 tb2
where not exists(select first 1 tb1.codigo from tabela1 tb1 where tb1.codigo = tb2.codigo)

caso nao seja, explique melhor o seu caso.

Espero ter ajudado.

Cleber
GOSTEI 0
William

William

24/07/2012

Colega caso vc possua conhecimentos em triggers e exceptions, basta criar uma excption (Registro duplicado!) e dispará-la usando um trigger do tipo Before Insert, ou seja, vc monta um select para verificar se o código já existe na tabela caso exista vc dispara a exception e cancela o INSERT.
GOSTEI 0
Deivison Melo

Deivison Melo

24/07/2012

Caso desejar você também pode criar uma chave única...
GOSTEI 0
Vtrx

Vtrx

24/07/2012

Vou testar a solução proposta,mas deixa eu complementar melhor para voces.
Eu estou usando ,para inserir registros,a seguinte sequencia;
INSERT INTO tabela.
( CODIGOS,DESCRIT,POSI,STATUS,PRECO,ESTOQUE,MODELO,COMPO,MOD,DESC,QUANT,TIP)
Values (valores,etc)
Eu tenho uma rotina que carrega num StringGrid os dados retirados de um arquivo .xls
Eu verifico se MODELO ja existe e dou o aviso encerrando a inserção.
Mas tenho uma rotina de inserção manual e se eu gravar um registro com um certo modelo,quando vou carregar o arquivo .xls,a rotina não deixa,mesmo que o arquivo contenha mais registros do mesmo modelo.
Então programei a opção de informar se Deseja acrescentar mais registros novos.
É nesta parte que preciso apenas gravar os registros que não tenham o campo CODIGOS repetido.
GOSTEI 0
Vtrx

Vtrx

24/07/2012

Pessoal,eu fiz umas rotinas para fazer oque estava precisando,vejam oque acha.
Cada vez que vou cadastrar um arquivo .xls que contén os ítens comforme a minha tabela,eu seleciono todos os códigos relacionado ao modelo para saber se o modelo ja foi cadastrado.
Usei 3 memos(invisível),um memo carrega todos os códigos do modelo(fiz uma rotina caso ja exista o modelo cadastrado),o outro memo carrega toda a coluna do StringGrid que contem os códigos a cadastrar e o terceiro memo é carregado com a diferença de códigos.
Então com um outro Stringgrid,que é uma cópia invisível do String principal,eu carregeui as linha com os códigos novos(baseado na listagem do Memo3),aí gravao e mostro num MessageBox quantos ítens novos foram gravados.
Será que não conseguiria isso usando comandos SQL no FB 2.0?
GOSTEI 0
POSTAR