Indices para Não-Duplicação
28/11/2005
0
Estou usando o D6 com Zeos e o PostGreSQL e a qualidade do meu sistema está mt superior.
Porém me deparei com um problema que também já tive no FireBird mas gostaria de saber se tem como resolver.
Por exemplo,crio a tabela:
CREATE TABLE TipoDeCobranca
(
tco_codigo INTEGER,
tco_descricao VARCHAR(30) NOT NULL,
constraint pk_tco_codigo primary key (tco_codigo),
constraint uk_tco_descricao unique (tco_descricao)
)
Fazendo desta forma eu incluo na boa mas quando o caracter muda MAIUSCULA/minuscula ele aceita.
Exemplo:
INSERT INTO TipoDeCobranca VALUES (1, ´Carteira´);
INSERT INTO TipoDeCobranca VALUES (2, ´CARTEIRA´);
INSERT INTO TipoDeCobranca VALUES (3, ´CaRtEirA´);
Jà vi em vários lugares que eu poderia criar alguma trigger tipo fazendo um
SELECT COUNT(*) FROM tipodecobranca WHERE UPPER(tco_descricao) = ´tal tal tal´ e comparar.
Mas senhores, não há outra forma de resolver? talvez criando algum indice no campo definindo um Collation diferente? Gostaria que o banco de dados verificasse isto para mim. Teria como?
Pois eu não gostaria de fixar no meu sistema que tudo seja MAIUSCULOS e sem acentuação.
Abraços!!!
Romulo Oliveira Almeida
Romulocpd
Posts
28/11/2005
_rodfaria_
Algo assim:
CREATE TABLE TipoDeCobranca
(
tco_codigo INTEGER,
tco_descricao_indice VARCHAR(30) NOT NULL,
tco_descricao_original VARCHAR(30) NOT NULL,
constraint pk_tco_codigo primary key (tco_codigo),
constraint uk_tco_descricao_indice unique (tco_descricao_indice)
)
E faça insert´s assim:
INSERT INTO TipoDeCobranca VALUES (1, Upper(´Carteira´),´Carteira´);
INSERT INTO TipoDeCobranca VALUES (2, Upper(´CARTEIRA´),´CARTEIRA´);
INSERT INTO TipoDeCobranca VALUES (3, Upper(´CaRtEirA´),´CaRtEirA´);
* Substitua Upper pela função correta para maiúsculas. Não me lembro agora.
28/11/2005
Romulocpd
É uma dica interessante, mas isso até poderia sobrecarregar o banco de dados pois teria que fazer isso para cada indice unico em cada tabela do sistema. O sistema chegará a 103 tabelas até o momento.
28/11/2005
_rodfaria_
Normalize (http://www.imasters.com.br/artigo.php?cn=2521&cc=149) seu banco de dados e para evitar este problema do usuário digitar a descrição faça uso de ´dblookup´
28/11/2005
Romulocpd
Veja Rod que não estou usando como chave explicitamente, só quero evitar duplicação.
Imagina no cadastro de Condições de Pagamento o sistema deixar passar:
A VISTA
A Vista
À Vista
Vista
Desta forma só queria que o banco não permitisse, mas independente de Maiusculas e Minusculas, mas talvez eu vou ter que fazer um UPPER mesmo para evitar isso.
30/12/2005
Joni Nunes
Resumindo a história e mostrando algo de útil efetivamente, vai lá:
1. Defina padrões para o seu sistema;
2. Crie uma constraint no banco para evitar a duplicidade;
É isso ai, espero ter colaborado de alguma forma.
30/12/2005
Romulocpd
Este foi o caminho que tive que fazer, o sistema é tudo em Maiusculo e nao tem acentuação. Daí pra nao ter problema, vai ter cliente que vai reclamar mas nao tem outro caminho.
Vlw
Clique aqui para fazer login e interagir na Comunidade :)