Campo primario sem ser unique

Firebird

24/11/2003

como fazer para um campo primario não ser unique, isso é, receber dados repetidos.

Grato pela Atenção


Gandalf

Gandalf

Curtidas 0

Respostas

Afarias

Afarias

24/11/2003

*não* faz!!

A condição *fundamental* para uma chave primária é ser ÚNICO!! -- não teria sentido um CADASTRO NACIONAL DE PESSOA FÍSICA (CPF) se pudesse haver duas pessoas com o mesmo número -- então, quando vc enviasse sua declaração de imposto de renda, como o leão ia saber quem é vc???


T+


GOSTEI 0
Gandalf

Gandalf

24/11/2003

bom não to fazendo um programa pra fazenda, e uma tabela que se cadastrar as operaões e o operador não faz tudo de uma vez.

No IBOConsole é so ir em Unique Constraints e remover alinha correspondente.


GOSTEI 0
Afarias

Afarias

24/11/2003

|bom não to fazendo um programa pra fazenda, e uma tabela que se
|cadastrar as operaões e o operador não faz tudo de uma vez.

foi só um exemplo! :roll:


|No IBOConsole é so ir em Unique Constraints e remover alinha
|correspondente.

pode até ser q vc consiga realmente ´driblar´ o banco removendo o índice/contraint único(a) criado como suporte a chave primária (o q seria uma falha/bug do IB possivelmente corrigida em versões futuras e muito provavelmente não existente em muitos outros bancos)

Isso -- se realmente for possível -- não quer dizer que esteja certo! Fazer mau uso da ferramenta ou dos conceitos base de modelagem de dados pode tornar seu sistema uma fonte de problemas no futuro.

Só minha opnião.!


T+


GOSTEI 0
Gandalf

Gandalf

24/11/2003

mas o banco de dados não e pra te ajudar?
se existem problemas em que o campo primario tem de ser repetido, isso não pode ser um bug, ou não deve ser tratado com um bug, ja que existe a necessidade em certas aplicações de compo primario ser repetido.

na minha aplicação o campo ´operacao´ e o mais importante. poderia ter colocado ele como não primario mas os demais campos (coisas do tipo data, inicio, termino) pode acontecer de vir repetido tbm.

tbm é só uma opinião.

abraços...


GOSTEI 0
Afarias

Afarias

24/11/2003

|mas o banco de dados não e pra te ajudar?

Sim, mas é necessário conhecê-lo. Um alicate de crimpar (cabos de rede) será muito pouco útil para cortar fios elétricos.


|se existem problemas em que o campo primario tem de ser repetido,
|isso não pode ser um bug, ou não deve ser tratado com um bug, ja que
|existe a necessidade em certas aplicações de compo primario ser
|repetido.

Isso não existe!!! Se um campo tem de ser repetido então ele não deve ser CHAVE PRIMÁRIA! *não é sua natureza* -- A questão ai é entender os conceitos.


|na minha aplicação o campo ´operacao´ e o mais importante. poderia ter
|colocado ele como não primario mas os demais campos (coisas do tipo
|data, inicio, termino) pode acontecer de vir repetido tbm.

Ser o mais importante não é ser chave primária. A chave primária em um banco de dados relacional deve identificar únicamente cada tupla (linha).

Se vc pode ter vários registros de mesma operação está claro q esta não é uma chave primária!

No seu caso, vc poderia criar um campo alimentado por um generator para ser sua chave primária -- este campo não tem q ter qualquer ´função de negócio´ (isso é normal e tb uma boa prática) -- servirá ´apenas´ para identificar exclusivamente cada registro!!

Aqui já não é questão de opnião. Se vc não possuir uma chave primária (de verdade) NÃO conseguirá editar um ÚNICO registro (pelo menos com facilidade) -- e não poderá garantir que as operações nesta tabela sejam corretas.


T+


GOSTEI 0
Gandalf

Gandalf

24/11/2003

vc tem razão!!!
o problema e que qualquer consulta que eu fizer no meu banco de dados tera de ser feita por operação, data, refulgo, etc. não tenho a necessidade de diferenciar campos, como na tebela de componentes onde cada uma tem um codigo especifico, com isso um campo sequencial nao me sera util. pos isso perguntei sobre o campo não ser unique. talvez isso me gere problemas no futuro.


GOSTEI 0
Gandalf

Gandalf

24/11/2003

ja que estamos neste debate me ajude aqui:

quando a operação e concluida preciso somar as peças produzidas e inserir no campo de uma outra tabela. o problema e que começam uma operação sem ter concluida a anterior entao os dados ficam espalhados:

operação 10 quantidade X
operação 10 quantidade X
operação 20 quantidade X
operação 30 quantidade X
operação 20 quantidade X
operação 10 quantidade X
etc;

como vou fazer para ele somar as quantidades de peças de determinada operação.


GOSTEI 0
Afarias

Afarias

24/11/2003

select sum(quantidade) from sua_tabela
where operacao = 10;



T+


GOSTEI 0
Gandalf

Gandalf

24/11/2003

valeu pela resposta
isso eu tava ligado, mas como eu coloco isso em uma variavel?

desculpe a chatiação


GOSTEI 0
Gandalf

Gandalf

24/11/2003

valeu ja descobri!


GOSTEI 0
Afarias

Afarias

24/11/2003

uma variável ONDE???


no INTERBASE (SP/Trigger) ::

select sum(quantidade) from sua_tabela
where operacao = 10
into :sua_variavel;


no Delphi (seno o SQL de um componente xxQuery um, o acima) ::


xxQuery1.Open;
sua_variavel := xxQuery1.Fields[0].AsInteger; // ou AsFloat, ...


T+


GOSTEI 0
Gandalf

Gandalf

24/11/2003

não descobri não
não deu certo
se vc poder me responder.

valeu


GOSTEI 0
Afarias

Afarias

24/11/2003

|se vc poder me responder.

??

veja minha resposta anterior. espero q ajude.


T+


GOSTEI 0
Gandalf

Gandalf

24/11/2003

agora como faço para passar nome da tabela e operacao como parametro?

valeu


GOSTEI 0
Gandalf

Gandalf

24/11/2003

para facilitar:

como eu faço para passar como paramentro o codigo sql do componente IBQuery?

Grato pela GRANDE atenção;


GOSTEI 0
Afarias

Afarias

24/11/2003

bom, existem muitas formas de fazer isso... é muito específico. Aqui vai só um peq. exemplo::


procedure TxxDataModule.OpenQuery(ATableName: string);
const
SQLText = ´select * from ¬s´;
begin
with xxQuery1 do
begin
Transaction.Commit;
SQL.Text := Format(SQLText, [ATableName]);
Open;
end;
end;


então vc pode fazer::

OpenQuery(´nome_da_tabela);


T+


GOSTEI 0
POSTAR