[firebase-br] Criar campo "Identity" em tabela com dados
Gladiston Santana
gladiston em vidy.com.br
Ter Jun 11 09:13:31 -03 2019
Veja a instrução que passei para certo time de desenvolvimento quando eles
tiveram a mesma tarefa que a sua, e não quiseram usar mais sequenciadores,
mas o novo tipo identity.
Queira por gentileza adaptar as suas necessidades:
No fb a sequencia para adicionar um campo autoincremental a uma tabela com
dados existentes seguiria os seguintes passos.
Premissas:
Tabela=produto_fabcomponentes,
novo campo autoincremental=id_produto_fabcomponente
1. crie uma nova tabela com as mesmas definições da tabela anterior, porém
com o campo autoincremental:
CREATE TABLE PRODUTO_FABCOMPONENTES2 (
ID_PRODUTO_FABCOMPONENTE D_ROWID GENERATED BY DEFAULT AS IDENTITY
PRIMARY KEY, -- note que é autoincremental, d_rowid é bigint
CODITEM_PRODUTO D_CODIGO30,
CODCOMPONENTE D_CODIGO30,
SEQ D_SEQUENCIA_LONGA,
QUANTIDADE D_QUANTIDADE,
UNIDADE D_UNIDADE,
COMENTARIO D_COMENTARIO,
CORTE_X_CM D_VALOR2,
CORTE_Y_CM D_VALOR2,
LAST_UPDATE D_CURRENT_TIME,
LAST_OWNER D_CURRENT_USER
);
2. Vamos popular a primeira tabela com o conteudo da primeira.
Note que não vou mencionar ID_PRODUTO_FABCOMPONENTE por que esse valor nao
existia na tabela anterior e receberá valores novos.
Contudo se você já tinha esse campo e apenas não era autoincremental, você
deverá mencioná-lo.
insert into produto_fabcomponentes2 (
-- id_produto_fabcomponente,
coditem_produto,
codcomponente,
seq,
quantidade,
unidade,
comentario,
corte_x_cm,
corte_y_cm,
last_update,
last_owner)
select
-- id_produto_fabcomponente,
coditem_produto,
codcomponente,
seq,
quantidade,
unidade,
comentario,
corte_x_cm,
corte_y_cm,
last_update,
last_owner
from produto_fabcomponentes
order by coditem_produto, codcomponente
3. confere se ambas as tabelas tem os mesmos resultados
select
(select count(*) from PRODUTO_FABCOMPONENTES) as count1,
(select count(*) from PRODUTO_FABCOMPONENTES2) as count2
from rdb$database
4. Na tabela antiga PRODUTO_FABCOMPONENTES, apague qualquer dependencia
antes de prosseguir.
Se a dependencia for uma SP, tente comentar as linhas.
5. Se ambas tem os mesmos resultados, apague a tabela antiga:
DROP TABLE PRODUTO_FABCOMPONENTES;
6. Recrie-a novamente com o conteudo da nova:
CREATE TABLE PRODUTO_FABCOMPONENTES (
ID_PRODUTO_FABCOMPONENTE D_ROWID GENERATED BY DEFAULT AS IDENTITY
PRIMARY KEY,
CODITEM_PRODUTO D_CODIGO30,
CODCOMPONENTE D_CODIGO30,
SEQ D_SEQUENCIA_LONGA,
QUANTIDADE D_QUANTIDADE,
UNIDADE D_UNIDADE,
COMENTARIO D_COMENTARIO,
CORTE_X_CM D_VALOR2,
CORTE_Y_CM D_VALOR2,
LAST_UPDATE D_CURRENT_TIME,
LAST_OWNER D_CURRENT_USER
);
7. Popule-a novamente, dessa vez note que o campo identity não está
comentado porque queremos aproveitar a sequencia anterior:
insert into produto_fabcomponentes (
id_produto_fabcomponente, -- agora o autoincremento será reaproveitado
coditem_produto,
codcomponente,
seq,
quantidade,
unidade,
comentario,
corte_x_cm,
corte_y_cm,
last_update,
last_owner)
select
id_produto_fabcomponente,
coditem_produto,
codcomponente,
seq,
quantidade,
unidade,
comentario,
corte_x_cm,
corte_y_cm,
last_update,
last_owner
from produto_fabcomponentes2
8. confere se ambas as tabelas tem os mesmos resultados
select
(select count(*) from PRODUTO_FABCOMPONENTES) as count1,
(select count(*) from PRODUTO_FABCOMPONENTES2) as count2
from rdb$database
9. CORRIGIR O PROXIMO NUMERO DA SEQUENCIA:
SELECT MAX(ID_produto_fabcomponente)+1 AS NOVO_NUMERO
FROM produto_fabcomponentes;
10. A tabela nova recebeu valores de id_produto_fabcomponente que eram
literais,
por isso o autoincremento nessa tabela ainda está virgem e comecará com 1,
daí precisamos que ele reinicie no proximo numero, supondo que no passo
anterior o novo_numero seja 1998:
ALTER TABLE produto_fabcomponentes
ALTER COLUMN id_produto_fabcomponente restart with 1998;
Em dom, 9 de jun de 2019 às 19:02, Siro <siro em protej.com.br> escreveu:
> Estou tentando migrar do fb 2.5 para o 3.0 e me deparei com problemas
> para criação de campos Identity.
>
> Não obtive sucesso quando a tabela já possui dados. Utilizo o comando
> abaixo:
>
> ALTER TABLE "(TABELA)" ADD ID INTEGER GENERATED BY DEFAULT AS IDENTITY
>
> Se a tabela se encontra sem dados o campo é criado normalmente.
>
> Fiz varias pesquisas (dentro do meu alcance) buscando informações que
> pudessem me auxiliar, mas não obtive sucesso.
>
> Alguém poderia me orientar se é possível criar campos do tipo IDENTITY
> em tabelas que já estejam povoadas?
>
> O objetivo e deixar de utilizar "Triggers e Sequence" em campos PK no
> Fb 3.0.
>
> Desde já agradeço
>
>
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas:
> http://www.firebase.com.br/pesquisa_lista.html
>
--
A Vidy possui um Sistema de Gestão da Qualidade estruturado e com
Certificação ISO 9001 há mais de 10 anos, mantendo seu foco na Qualidade e
na Melhoria Continua.
Em março de2018 migramos com sucesso para a nova versão da ISO 9001.
Somos a única Empresa Brasileira de Engenharia de Laboratórios com
certificação com o Escopo Completo; desde Projetos, Engenharia, Construção,
Fabricação e Instalação de Laboratórios.
Mais detalhes sobre a lista de discussão lista