Criar nova chave primaria numa tabela ja existente
9 respostas
R
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…
R
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.
R
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!
L
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.
R
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.
L
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