Ich möchte einen vorhandenen Primärschlüssel in einer SQL Azure-Tabelle ändern.
Derzeit hat es eine Spalte, und ich möchte eine weitere hinzufügen.
Nun, auf SQL Server 2008 war dies ein Kinderspiel, nur in SSMS, poof. Getan. So sieht die PK aus, wenn ich sie über SQL Server skripte:
ALTER TABLE [dbo].[Friend] ADD CONSTRAINT [PK_Friend] PRIMARY KEY CLUSTERED
(
[UserId] ASC,
[Id] ASC
)
Wenn ich jedoch in SQL Azure versuche, das Obige auszuführen, schlägt dies natürlich fehl:
Table 'Friend' already has a primary key defined on it.
Gut, also versuche ich den Schlüssel fallen zu lassen:
Tables without a clustered index are not supported in this version of SQL Server. Please create a clustered index and try again.
Ok, also versuche ich, einen temporären Clustered-Index zu erstellen, um die PK zu löschen:
CREATE CLUSTERED INDEX IX_Test ON [Friend] ([UserId],[Id])
Was in ... endet:
Cannot create more than one clustered index on table 'Friend'. Drop the existing clustered index 'PK_Friend' before creating another.
Großartig, ein guter Moment.
Wie füge ich die UserId-Spalte zu meiner vorhandenen PK hinzu?
quelle
Antworten:
Hinweis: Ab Azure SQL Database v12 gelten diese Einschränkungen nicht mehr.
Das ist kein Primärindex. Es gibt so etwas wie einen "Primärschlüssel" und es gibt auch so etwas wie einen "Clustered Index". Eindeutige Konzepte, oft verwirrt. In Anbetracht dieser Unterscheidung lassen Sie uns die Frage noch einmal betrachten:
F1) Kann der Clustered-Index in einer SQL Azure-Tabelle geändert werden?
A: Ja. Verwendung
WITH (DROP_EXISTING=ON)
:F2) Kann der Clustered-Index einer Tabelle mit einer Primärschlüsseleinschränkung geändert werden?
A: Ja, genau wie oben, solange die Primärschlüsseleinschränkung nicht über den Clustered-Index erzwungen wird:
F3) Kann die Primärschlüsselbedingung einer Tabelle geändert werden?
A: Ja, solange die primäre Einschränkung nicht über den Clustered-Index erzwungen wird:
F4) Kann der Primärschlüssel einer Tabelle geändert werden, wenn er über den Clustered-Index erzwungen wird?
A: Ja, wenn die Tabelle keine Zeilen hatte:
F5) Kann der Primärschlüssel einer Tabelle geändert werden, wenn er über den Clustered-Index erzwungen wird, wenn die Tabelle gefüllt ist?
A: Nein. Alle Vorgänge, die einen aufgefüllten Clustered-Index in einen Heap konvertieren, werden in SQL Azure blockiert, auch wenn die Tabelle leer ist :
Als Randnotiz: Die Einschränkung kann geändert werden, wenn die Tabelle abgeschnitten ist .
Die Problemumgehung zum Ändern der PK-Einschränkung einer aufgefüllten Tabelle besteht darin, den guten alten
sp_rename
Trick auszuführen:Der
sp_rename
Ansatz weist einige Probleme auf, insbesondere, dass Berechtigungen für die Tabelle beim Umbenennen nicht übertragen werden, sowie Einschränkungen für Fremdschlüssel.quelle