Alterar a primary key de uma tabela qualquer, fazendo com que a nova PK seja um inteiro alimentado por uma sequence. Essa tabela já possui muitos registros inseridos, o que nos impede de descartar os dados antigos.
Solução sugerida: Preencher automaticamente o novo campo, usando uma chamada direta à sequence e utilizando os comandos import/export para manter os dados já inseridos anteriormente.
Bom, mãos a obra ...O exemplo da tabela é bem simples, o objetivo aqui é mostrar como fazer.
Como usuário administrador do DB, vamos conectar o DB (Minha plataforma é Linux)
$ db2 connect to sample Database Connection Information Database server = DB2/LINUX 9.5.5 SQL authorization ID = DB2INST1 Local database alias = SAMPLE
DDL da tabela a ser alterada:
create table inf.t_company ( name varchar (32) not null, cnpj varchar (20) not null, phone varchar (20) not null, constraint pk primary key (cnpj) ); insert into inf.t_company values ('Google Brasil','11.111.111/0001-11','11 3344-5555'), ('Bruno Almeida','22.222.222/0001-22','21 2333-5566'), ('Cartorio ABC ','33.333.333/0001-33','65 6677-8899');Coloque isso dentro de um arquivo .sql e execute direto no prompt para a criação:
$ db2 -tvf antiga.sql drop table inf.t_company DB20000I The SQL command completed successfully. create table inf.t_company ( name varchar (32) not null, cnpj varchar (20) not null, phone varchar (20) not null, constraint pk primary key (cnpj) ) DB20000I The SQL command completed successfully. insert into inf.t_company values ('Google Brasil','11.111.111/0001-11','11 3344-5555'), ('Bruno Almeida','22.222.222/0001-22','21 2333-5566'), ('Cartorio ABC','33.333.333/0001-33','65 6677-8899') DB20000I The SQL command completed successfully.
Para exibir a estrutura da tabela, execute o comando:
db2 "describe table <nome da tabela>
db2 "describe table <nome da tabela>
$ db2 describe table inf.t_company
Data type Column
Column name schema Data type name Length Scale Nulls
--------------------------- --------- ------------------- ---------- ----- ------
NAME SYSIBM VARCHAR 32 0 No
CNPJ SYSIBM VARCHAR 20 0 No
PHONE SYSIBM VARCHAR 20 0 No
Vamos criar agora a sequence que vai popular o novo campo:
db2 "CREATE SEQUENCE INF.COMPANY_ID AS INTEGER MINVALUE 1 MAXVALUE 2147483647 START WITH 1 INCREMENT BY 1 CACHE 5 NO CYCLE NO ORDER" DB20000I The SQL command completed successfully.Com isso, vou exportar os dados atuais da tabela, aproveitando para criar um novo campo dentro do .ixf que terá os dados oriundos da sequence. Esses valores serão usados no campo novo da tabela INF.T_COMPANY (que chamaremos de ID).
db2 "export to company.ixf of ixf select nextval for INF.COMPANY_ID as ID, NAME, CNPJ, PHONE from INF.T_COMPANY" Number of rows exported: 3
Com o export em mãos, vou recriar a tabela nova, com a nova PK. Abaixo está a DDL:
drop table inf.t_company; create table inf.t_company ( id integer not null, name varchar (32) not null, cnpj varchar (20) not null, phone varchar (20) not null, constraint pk primary key (id) );
Agora vamos importar os dados, com os valores da coluna ID.
$ db2 "import from company.ixf of ixf insert into inf.t_company" SQL3110N The utility has completed processing. "3" rows were read from the input file. Number of rows read = 3 Number of rows skipped = 0 Number of rows inserted = 3 Number of rows updated = 0 Number of rows rejected = 0 Number of rows committed = 3
Pronto, agora os dados já estão importados com a nova coluna.
$ db2 "select * from inf.t_company"
ID NAME CNPJ PHONE
----------- -------------------------- ------------------------- --------------------
1 Google Brasil 11.111.111/0001-11 11 3344-5555
2 Bruno Almeida 22.222.222/0001-22 21 2333-5566
3 Cartorio ABC 33.333.333/0001-33 65 6677-8899
3 record(s) selected.
A partir desse momento, a aplicação já pode usar a sequence para popular o campo ID da tabela.
É isso, até a próxima.
Nenhum comentário:
Postar um comentário