Indices para Não-Duplicação

28/11/2005

0

Olá Amigos,

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

Romulocpd

Responder

Posts

28/11/2005

_rodfaria_

Apenas uma idéia. Tenha dois campos com a mesma informação. Num você converte para maiúsculas e cria um índice sobre ele. O outro você deixa como foi digitado. Nos seus relatórios você usa o campo ´original´.

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.


Responder

28/11/2005

Romulocpd

Rod,

É 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.


Responder

28/11/2005

_rodfaria_

Eu raramente uso campos tipo caracter como chave de tabela.

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´


Responder

28/11/2005

Romulocpd

Olá,

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.


Responder

30/12/2005

Joni Nunes

Por que vc simplesmente nao define um padrão para o seu sistema, por exemplo, só permitir informações em MAIUSCULO, assim vc evitaria esses problemas, até por que, qual usuário iria necessitar do nome de um produto ou de um cliente escrito assim ´JoNi´.


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.


Responder

30/12/2005

Romulocpd

Fala Junifoz,

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


Responder

APRENDA A PROGRAMAR DO ZERO AO PROFISSIONAL

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar