[firebase-br] Attempt to store duplicate value (visible to active transactions) in unique index
Hélio Oliveira
hpensador em gmail.com
Qua Jan 26 17:18:29 -03 2011
Boa tarde Colegas!
Este erro ocorre durante a tentativa de criação de uma chave primaria em
uma tabela. Em um post anterior o Carlos Cantu respondeu indicando um
artigo onde o autor informa que este erro ocorre devido a duplicidade de
registros (chave-primaria) porém não é este o meu problema conforme
demonstro abaixo (Script de atualização completo.)
Desculpem sei que a mensagem ficou um tanto quanto longa...
connect c:\Diretorio\BASE.gdb user "SYSDBA" password "masterkey";
CREATE TABLE tabela_aux(
MATRICULA INTEGER,
MES INTEGER,
ANO INTEGER,
SEQUENCIA INTEGER,
PROVENTO INTEGER,
REFERENCIA NUMERIC(6,2),
VALOR NUMERIC(12,2),
F_V VARCHAR(1)
);
commit work;
insert into tabela_aux select * from variavel where valor is not null
and valor > 0;
commit work;
delete from variavel;
commit work;
update RDB$RELATION_FIELDS set
RDB$NULL_FLAG = 1
where (RDB$FIELD_NAME = 'MATRICULA')
and (RDB$RELATION_NAME = 'VARIAVEL');
commit work;
update RDB$RELATION_FIELDS set
RDB$NULL_FLAG = 1
where (RDB$FIELD_NAME = 'MES')
and (RDB$RELATION_NAME = 'VARIAVEL');
commit work;
update RDB$RELATION_FIELDS set
RDB$NULL_FLAG = 1
where (RDB$FIELD_NAME = 'ANO')
and (RDB$RELATION_NAME = 'VARIAVEL');
commit work;
update RDB$RELATION_FIELDS set
RDB$NULL_FLAG = 1
where (RDB$FIELD_NAME = 'SEQUENCIA')
and (RDB$RELATION_NAME = 'VARIAVEL');
commit work;
update RDB$RELATION_FIELDS set
RDB$NULL_FLAG = 1
where (RDB$FIELD_NAME = 'PROVENTO')
and (RDB$RELATION_NAME = 'VARIAVEL');
commit;
alter table variavel add constraint pk_variav primary key (matricula,
mes, ano, sequencia, provento);
commit;
set term ^;
create or alter procedure popula_variavel
as
declare variable matricula integer;
declare variable mes integer;
declare variable ano integer;
declare variable sequencia integer;
declare variable provento integer;
declare variable referencia numeric(6,2);
declare variable valor numeric(12,2);
declare variable f_v varchar(1);
begin
for select matricula, mes, ano, sequencia, provento, referencia,
valor, f_v
from tabela_aux
where valor is not null
and valor > 0
into :matricula, :mes, :ano, :sequencia, :provento, :referencia,
:valor, :f_v do
begin
if (not exists(select v.matricula,
v.mes,
v.ano,
v.sequencia,
v.provento
from variavel v
where v.mes = :mes
and v.ano = :ano
and v.sequencia = :sequencia
and v.matricula = :matricula
and v.provento = :provento)) then
insert into variavel (matricula, mes, ano, sequencia, provento,
referencia, valor, f_v)
values (:matricula, :mes, :ano, :sequencia, :provento,
:referencia, :valor, :f_v);
end
end^
commit work^
set term ^;
execute procedure popula_variavel;
commit work;
drop procedure popula_variavel;
commit work;
--
[]'s,
Hélio Oliveira
Bel. Ciência da Computação
Técnico em Contabilidade
e-mail : hpensador em gmail.com
Skype : hpensador
www.hpensador.net
(71) 9975-9176
Mais detalhes sobre a lista de discussão lista