Como posso alterar uma restrição de chave primária usando a sintaxe SQL?

100

Eu tenho uma tabela que está faltando uma coluna em sua restrição de chave primária. Em vez de editá-lo por meio do SQL Server, quero colocá-lo em um script para adicioná-lo como parte de nossos scripts de atualização.

Que sintaxe posso usar para fazer isso? Devo descartar e recriar a restrição de chave?

Jason
fonte
5
AFAIK sim, você precisa descartar e recriar a restrição PK. Não me lembro de nenhum comando para adicionar uma coluna a uma restrição PK / FK já existente.
Seramme

Respostas:

149

Sim. A única maneira seria eliminar a restrição com uma tabela Alter e recriá-la.

ALTER TABLE <Table_Name>
DROP CONSTRAINT <constraint_name>

ALTER TABLE <Table_Name>
ADD CONSTRAINT <constraint_name> PRIMARY KEY (<Column1>,<Column2>)
darnir
fonte
11
Se você não souber o nome da restrição de chave primária, use a consulta encontrada aqui para procurá-la (ou procure e elimine tudo de uma vez). http://stackoverflow.com/a/13948609/945875
Justin
se não estiver claro ou se alguém cometer o mesmo erro, o nome da restrição não pode ser colocado entre aspas alter table PatientsInfo drop constraint PK__Patients__1CBB51380A338187está funcionando aqui
Maslow
1
Para aqueles que não sabem o nome da restrição: ALTER TABLE db. table DROP PRIMARY KEY, ADD PRIMARY KEY ( id1, id2);
karsten314159
21

PRIMARY KEY CONSTRAINTnão pode ser alterado, você só pode abandoná-lo e criar novamente. Para grandes conjuntos de dados, pode causar um longo tempo de execução e, portanto, indisponibilidade da tabela.

Oleg Dok
fonte
3

Em termos de desempenho, não há motivo para manter índices não agrupados durante isso, pois eles serão atualizados novamente ao serem descartados e criados. Se for um conjunto de big data, você deve considerar renomear a tabela (se possível, alguma configuração de segurança nela?), Recriar uma tabela vazia com as chaves corretas para migrar todos os dados para lá. Você deve ter certeza de que tem espaço suficiente para isso.

Ok
fonte
3

No meu caso, quero adicionar uma coluna a uma chave primária (coluna4). Usei este script para adicionar column4

ALTER TABLE TableA
DROP CONSTRAINT [PK_TableA]

ALTER TABLE TableA
ADD CONSTRAINT [PK_TableA] PRIMARY KEY (
    [column1] ASC,
    [column2] ASC, 
    [column3] ASC,
    [column4] ASC
)
MNF
fonte
-4

você pode renomear objetos de restrição usando sp_rename (conforme descrito nesta resposta )

por exemplo:

EXEC sp_rename N'schema.MyIOldConstraint', N'MyNewConstraint'
Garrett Taiji
fonte
3
A questão era como alterar a restrição, ou seja, ADICIONAR uma coluna, não como renomear.
Andrew Steitz