AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 6937
Accepted
Magnus
Magnus
Asked: 2011-10-19 10:21:54 +0800 CST2011-10-19 10:21:54 +0800 CST 2011-10-19 10:21:54 +0800 CST

Como posso alterar uma chave primária existente no SQL Azure?

  • 772

Desejo modificar uma chave primária existente em uma tabela do SQL Azure.
Atualmente, tem uma coluna e desejo adicionar outra.

Agora, no SQL Server 2008 isso foi moleza, só fiz no SSMS, puf. Feito. É assim que o PK se parece se eu fizer o script do SQL Server:

ALTER TABLE [dbo].[Friend] ADD  CONSTRAINT [PK_Friend] PRIMARY KEY CLUSTERED 
(
  [UserId] ASC,
  [Id] ASC
)

No entanto, no SQL Azure, quando tento executar o acima, é claro que falhará:

Table 'Friend' already has a primary key defined on it.

Tudo bem, então eu tento largar a chave:

Tables without a clustered index are not supported in this version of SQL Server. Please create a clustered index and try again.

Ok, então tento criar um índice clusterizado temporário para descartar o PK:

CREATE CLUSTERED INDEX IX_Test ON [Friend] ([UserId],[Id])

O que resulta em: Cannot create more than one clustered index on table 'Friend'. Drop the existing clustered index 'PK_Friend' before creating another.

Ótimo, um momento catch22.

Como adiciono a coluna UserId ao meu PK existente?

primary-key azure-sql-database
  • 1 1 respostas
  • 15886 Views

1 respostas

  • Voted
  1. Best Answer
    Remus Rusanu
    2011-10-19T13:38:00+08:002011-10-19T13:38:00+08:00

    Observação: a partir do Banco de Dados SQL do Azure v12, essas restrições não se aplicam mais.

    O não existe como um 'índice primário'. Existe uma 'chave primária' e também existe um 'índice agrupado'. Conceitos distintos, muitas vezes confundidos. Com esta distinção em mente, vamos revisitar a questão:

    Q1) O índice clusterizado em uma tabela do SQL Azure pode ser modificado?
    R: Sim. Usar WITH (DROP_EXISTING=ON):

    create table Friend (
        UserId int not null,
        Id int not null);
    go  
    create clustered index cdxFriend on Friend (UserId, Id);
    go
    create clustered index cdxFriend on Friend (Id, UserId) with (drop_existing=on);
    go
    

    Q2) O índice clusterizado de uma tabela que possui uma restrição de chave primária pode ser modificado?
    R: Sim, como acima, desde que a restrição de chave primária não seja aplicada por meio do índice clusterizado:

    create table Friend (
        UserId int not null,
        Id int not null identity(1,1),
        constraint pk_Friend primary key nonclustered (Id));
    create clustered index cdxFriend on Friend (UserId, Id);
    go
    create clustered index cdxFriend on Friend (Id, UserId) with (drop_existing=on);
    go
    

    Q3) A restrição de chave primária de uma tabela pode ser modificada?
    R: Sim, desde que a restrição primária não seja aplicada por meio do índice clusterizado:

    create table Friend (
        UserId int not null,
        Id int not null identity(1,1),
        constraint pk_Friend primary key nonclustered (Id));
    go
    create clustered index cdxFriend on Friend (UserId, Id);
    go
    alter table Friend drop constraint pk_Friend;
    alter table Friend add constraint pk_Friend primary key nonclustered (UserId)
    go
    

    Q4) A chave primária de uma tabela pode ser modificada quando aplicada por meio do índice clusterizado?
    R: Sim, se a tabela nunca teve linhas:

    create table Friend (
        UserId int not null,
        Id int not null identity(1,1),
        constraint pk_Friend primary key clustered (UserId, Id));
    go
    alter table Friend drop constraint pk_Friend;
    alter table Friend add constraint pk_Friend primary key clustered (Id, UserId)
    go
    

    Q5) A chave primária de uma tabela pode ser modificada quando aplicada por meio do índice clusterizado se a tabela for preenchida?
    R: Não. Qualquer operação que converta um índice clusterizado preenchido em um heap será bloqueada no SQL Azure, mesmo que a tabela esteja vazia :

    create table Friend (
        UserId int not null,
        Id int not null identity(1,1),
        constraint pk_Friend primary key clustered (UserId, Id));
    go
    insert into Friend (UserId) values (1);
    delete from Friend;
    go
    alter table Friend drop constraint pk_Friend;
    

    Como observação: a restrição pode ser modificada se a tabela for truncada .

    A solução alternativa para alterar a restrição PK de uma tabela preenchida é fazer o bom e velho sp_renametruque:

    create table Friend (
        UserId int not null,
        Id int not null identity(1,1),
        constraint pk_Friend primary key clustered (UserId, Id));
    go
    insert into Friend (UserId) values (1);
    go
    
    create table FriendNew (
        UserId int not null,
        Id int not null identity(1,1),
        constraint pk_Friend_New primary key clustered (Id, UserId));
    go
    
    set identity_insert FriendNew on;
    insert into FriendNew (UserId, Id) 
    select UserId, Id
    from Friend;
    set identity_insert FriendNew off;
    go
    
    begin transaction
    exec sp_rename 'Friend', 'FriendOld';
    exec sp_rename 'FriendNew', 'Friend';
    commit;
    go
    
    sp_help 'Friend';
    

    A sp_renameabordagem tem alguns problemas, sendo o mais importante que as permissões na tabela não são transferidas durante a renomeação, bem como restrições de chave estrangeira.

    • 34

relate perguntas

  • Por que usar um int como chave primária de uma tabela de pesquisa?

  • Existe algum benefício de uma chave primária que compreende todas as colunas da tabela?

  • Remova o campo da chave composta e reúna os dados duplicados

  • Quais são as desvantagens de usar UUID ou GUID como chave primária?

  • Chaves primárias de caractere x número inteiro

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve