Criar nova chave primaria numa tabela ja existente
9 respostas
robsonsm
Eu tenho uma tabela cuja chave primária é composta. Esta tabela já tem milhares de registros inclusive relacionamentos.
Eu preciso quebrar esta chave primaria e adicionar uma nova coluna identity para se tornar a nova chave primaria.
Alguem pode me dar uma dica de como fazer? Será q preciso criar uma nova coluna e acrescentar os ids via script primeiro e depois altera-la para chave primaria? e como vou fazer para que as tabela relacionadas cujo os registros ja existentes passem a se relacionar com essa nova chave?
Olá amigo, primeiramente vc tera que deletar a Constraint que esta sua chave primaria é composta!
Depois disso basta criar a nova constraint com os campos que irão pertencer a chave primaria!
A
andredecotia
Você pode explicar o porquê que está usando chave composta? Gostaria de entender sua regra de negócio…
robsonsm
não foi eu quem criou as regras, as tabelas, nem esta parte da aplicacao, por isso não sei te explicar motivo, so sei que vou ter q muda-la.
robsonsm
lickoski:
Olá amigo, primeiramente vc tera que deletar a Constraint que esta sua chave primaria é composta!
Depois disso basta criar a nova constraint com os campos que irão pertencer a chave primaria!
eu sei q vou ter q deletar a constraint e depois recriá-la para a nova chave.
A questão é qto a nova chave. Ela será uma nova coluna na tabela, por isso a dúvida. Será q vou ter q criar uma coluna normal e depois gravar os ids nesta coluna para depois tranformá-la em chave primária? Pois a tabela já possui milhares de registros e nao podem sem apagadas e para complicar, ainda existem tabelas q tinham chaves estrangeiras apontando para esta antiga chave composta.
Então como fazer tudo isso sem perder os dados e ainda permitir que os antigos registros das tabelas relacionadas não percam a integridade e passem a apontar para a nova chave primaria?
L
lickoski
robsonsm:
lickoski:
Olá amigo, primeiramente vc tera que deletar a Constraint que esta sua chave primaria é composta!
Depois disso basta criar a nova constraint com os campos que irão pertencer a chave primaria!
eu sei q vou ter q deletar a constraint e depois recriá-la para a nova chave.
A questão é qto a nova chave. Ela será uma nova coluna na tabela, por isso a dúvida. Será q vou ter q criar uma coluna normal e depois gravar os ids nesta coluna para depois tranformá-la em chave primária? Pois a tabela já possui milhares de registros e nao podem sem apagadas e para complicar, ainda existem tabelas q tinham chaves estrangeiras apontando para esta antiga chave composta.
Então como fazer tudo isso sem perder os dados e ainda permitir que os antigos registros das tabelas relacionadas não percam a integridade e passem a apontar para a nova chave primaria?
OK… Agora entendi…primeiramente delete a Constraint, depois disso crie seu novo campo, depois do campo criado popule este novo campo com as suas regras de negocio(sempre pensando que adiante vc tera a integridade), depois e so criar a Constraint novamente. Ja passei por este caso e deu tudo certo fazendo desta maneira!
luciano2
Na verdade acho q a dificuldade do colega é em definir qual campo será a chave. O que você deve saber é quais campos tornam seu registro único, todos estes campos serão chaves candidatas, depois você verá qual o menor conjunto de dados que garante a unicidade ex: cpf , ex2: RG + UF depois é só escolher o campo.
robsonsm
Na verdade a nova chave primaria vai ser mesmo uma nova coluna em branco q vai ser um id normal (1,2,3…). O problema eh q a tabela ja contem registros, entao acho q nao vai ter jeito e vou ter q criar a nova coluna e criar um script (cursor) para inserir ids nesta coluna para os registros ja existentes e depois tranformá-la na chave primaria. O q eu nao sei ainda é como vou fazer com que os registros de outras tabelas que tinham a chave estrangeira apontando para a chave primaria antiga desta tabela passe a se relacionar com nova chave mantendo a integridade ja que registros nestas tabelas tbm já existem.
luciano2
Você vai fazer o seguinte cria uma coluna B nas tabelas que se relacionam com ela.
Cria a coluna na tabela A na sua tabela
manda inserir os valores sequencias em A
e faz um script que pegue o valor A e coloque em B onde o valor da FK de B seja igual a PK de A
depois é só excluir as FK das tabelas q se relacionam
excluir a pk de sua tabela
definir A como PK e B com FK relacionada a A