Laden...

SQL: Fehlende Identity-Eigenschaft zu Primärschlüssel hinzufügen

Erstellt von thore.fiedermann vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.604 Views
thore.fiedermann Themenstarter:in
30 Beiträge seit 2007
vor 4 Jahren
SQL: Fehlende Identity-Eigenschaft zu Primärschlüssel hinzufügen

verwendetes Datenbanksystem: MS SQL Express 2014

Moin

Folgendes Problem: Ich habe eine Tabelle mit Primärschlüssel. Dieser wird von mir bis jetzt manuell vergeben (über MAX(Primärschlüssel + 1) ). Das Problem ist, dass ich einen bereits einmal vergebenen Primärschlüssel nicht mehr vergeben möchte. Dazu bietet sich die Identity-Eigenschaft mit Auto_Increment eigentlich an. Ich kann allerdings die Daten aus dieser Tabelle nicht löschen, da ich etliche Tabellen mit dem Primärschlüssel als Fremdschlüssel und dem CASCADE Delete anhängig habe.

Gibt es eine Möglichkeit diese Eigenschaft doch ohne DROP Table hinzuzufügen? Oder irgendwie zu simulieren? Ich hole mir den Schlüssel in einer eigenen StoredProcedure und habe alle Möglichkeiten, dort auf den nächsten freien (noch nie vergebenen Schlüssel) zuzugreifen.

Ich hoffe, ich konnt mich verständlich ausdrücken.

MfG
Thore

87 Beiträge seit 2016
vor 4 Jahren

Hallo,

der IDENTITY kannst du einen Startwert mitgeben. Dieser muss nicht 1 sein.

glandorf

thore.fiedermann Themenstarter:in
30 Beiträge seit 2007
vor 4 Jahren

Das weiß ich. Nichts desto trotz möchte das Management Studio die Tabelle droppen und neu anlegen.

16.806 Beiträge seit 2008
vor 4 Jahren

Das Management Studio erzeugt bei solchen Aktionen im Hintergrund auch nur SQL Code.
Wenn Dir das Verhalten nicht passt, dann schreib doch den gewünschten SQL Code selbst...? 🤔

DROP CONSTRAINT

C
26 Beiträge seit 2016
vor 4 Jahren

Das ist ein uraltes Problem.
Normalerweis würde man die Constraints temporär droppen und dann eine neue Identity-Spalte hinzufügen und die alte löschen.

Wenn Dir das zu aufwendig ist, gibt es ein paar Tricks die hier beschrieben werden:

https://stackoverflow.com/questions/6084572/sql-server-how-to-set-auto-increment-after-creating-a-table-without-data-loss/6086661#6086661

thore.fiedermann Themenstarter:in
30 Beiträge seit 2007
vor 4 Jahren

Das führt leider auch nicht zum Erfolg. Die Fehlermeldung lautet "Das Objekt konnte nicht gelöscht werden, da eine FOREIGN KEY-Einschränkung auf das Objekt verweist.". Ich habe 14 abhängige Objekte und dasmacht das Ganze sehr schwierig... Ich probiere in der Richtung noch einmal ein bisschen rum.

W
955 Beiträge seit 2010
vor 4 Jahren

Und wenn du Sequenzen statt IDENTITY verwendest?

3.511 Beiträge seit 2005
vor 4 Jahren

Das einfachste ist:
DB in SINGLE USER Mode versetzen. Alle Constraints deaktivieren


EXEC sp_MSforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT ALL"

Neue Tabelle erzeugen mit gleicher Struktur nur mit IDENTITY. Tabelleninhalt rüber schubsen (INSERT INTO x SELECT FROM y). Alte Tabelle droppen. Neue Tabelle umbennenen. Alle Constraints wieder aktivieren.


exec sp_MSforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT ALL"

DB wieder in MULTI USER versetzen. Je nach Datenmenge ist das ziemlich schnell gemacht.

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)