Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
SQL: Fehlende Identity-Eigenschaft zu Primärschlüssel hinzufügen
thore.fiedermann
myCSharp.de - Member

Avatar #avatar-2373.jpg


Dabei seit:
Beiträge: 31
Herkunft: Deutschland

Themenstarter:

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

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
glandorf
myCSharp.de - Member

Avatar #avatar-4144.jpg


Dabei seit:
Beiträge: 67
Herkunft: Chemnitz

beantworten | zitieren | melden

Hallo,

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

glandorf
private Nachricht | Beiträge des Benutzers
thore.fiedermann
myCSharp.de - Member

Avatar #avatar-2373.jpg


Dabei seit:
Beiträge: 31
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

Das weiß ich. Nichts desto trotz möchte das Management Studio die Tabelle droppen und neu anlegen.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von thore.fiedermann am .
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16110

beantworten | zitieren | melden

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
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
codesoldier
myCSharp.de - Member



Dabei seit:
Beiträge: 29

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
thore.fiedermann
myCSharp.de - Member

Avatar #avatar-2373.jpg


Dabei seit:
Beiträge: 31
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
witte
myCSharp.de - Member



Dabei seit:
Beiträge: 966

beantworten | zitieren | melden

Und wenn du Sequenzen statt IDENTITY verwendest?
private Nachricht | Beiträge des Benutzers
Khalid
myCSharp.de - Experte

Avatar #avatar-2534.gif


Dabei seit:
Beiträge: 3627
Herkunft: Hannover

beantworten | zitieren | melden

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)
private Nachricht | Beiträge des Benutzers