Chcę zmodyfikować istniejący klucz podstawowy w tabeli SQL Azure.
Obecnie ma jedną kolumnę i chcę dodać kolejną.
Teraz na SQL Server 2008 było to bułka z masłem, właśnie zrobiłem to w SSMS, poof. Gotowy. Tak wygląda PK, jeśli wykonuję skrypt z SQL Server:
ALTER TABLE [dbo].[Friend] ADD CONSTRAINT [PK_Friend] PRIMARY KEY CLUSTERED
(
[UserId] ASC,
[Id] ASC
)
Jednak na SQL Azure, kiedy próbuję wykonać powyższe, to oczywiście się nie powiedzie:
Table 'Friend' already has a primary key defined on it.
W porządku, więc próbuję upuścić klucz:
Tables without a clustered index are not supported in this version of SQL Server. Please create a clustered index and try again.
Ok, więc próbuję utworzyć tymczasowy indeks klastrowany, aby usunąć PK:
CREATE CLUSTERED INDEX IX_Test ON [Friend] ([UserId],[Id])
Co skutkuje w:
Cannot create more than one clustered index on table 'Friend'. Drop the existing clustered index 'PK_Friend' before creating another.
Świetnie, chwila złapania22.
Jak dodać kolumnę UserId do mojej istniejącej PK?
źródło
Odpowiedzi:
Uwaga: od wersji 12 bazy danych SQL Azure te ograniczenia nie mają już zastosowania.
Nie ma czegoś takiego jak „indeks główny”. Istnieje coś takiego jak „klucz podstawowy”, a także coś takiego jak „indeks klastrowany”. Odrębne koncepcje, często mylone. Mając na uwadze to rozróżnienie, powróćmy do pytania:
P1) Czy można zmodyfikować indeks klastrowany w tabeli SQL Azure?
Odp .: Tak. Użyj
WITH (DROP_EXISTING=ON)
:Q2) Czy można zmodyfikować indeks klastrowy tabeli z ograniczeniem klucza podstawowego?
Odp .: Tak, tak jak powyżej, o ile ograniczenie klucza podstawowego nie jest wymuszane przez indeks klastrowany:
P3) Czy można zmodyfikować ograniczenie klucza podstawowego tabeli?
Odp .: Tak, dopóki podstawowe ograniczenie nie jest wymuszane przez indeks klastrowany:
P4) Czy klucz podstawowy tabeli można modyfikować, gdy jest egzekwowany przez indeks klastrowany?
Odp .: Tak, jeśli tabela nigdy nie miała żadnych wierszy:
P5) Czy klucz podstawowy tabeli można modyfikować, gdy jest wymuszany przez indeks klastrowany, jeśli tabela jest zapełniona?
Odp .: Nie. Każda operacja, która konwertuje zapełniony indeks klastrowany na stertę, zostanie zablokowana na SQL Azure, nawet jeśli tabela jest pusta :
Na marginesie: ograniczenie można zmodyfikować, jeśli tabela zostanie obcięta .
Obejściem problemu zmiany ograniczenia PK w zapełnionej tabeli jest wykonanie starej dobrej
sp_rename
sztuczki:sp_rename
Podejście ma pewne problemy, najważniejsze jest, że uprawnienia na stole nie przenoszą w czasie zmiany nazwy, a także ograniczenia klucz obcy.źródło