MS SQL: Fremdschlüssel auf IDENTITY-Spalten

Für eine umfangreichere Erweiterung eines Systems ist ein Umbau einer bereits laufenden Datenbank nötig. Der Inhalt einer Tabelle soll auf zwei Tabellen verteilt werden.

Ich habe eine Tabelle (tab_1), die einen Primärschlüssel in Form einer IDENTITY-Spalte (tab_id) enthält.
Ich erstelle eine zweite Tabelle (tab_2). Sie erhält ebenfalls einen Primärschlüssel, der gleichzeitig Fremdschlüssel ist (abhängig von tab_1.tab_id).

Soweit so gut. Nun mein Problem:
Wenn die Datenbank noch leer ist, dann werden alle Tabellen so angelegt, wie sie sein sollen mit allen Abhängigkeiten und Schlüsseln. Ist die Datenbank aber gefüllt, funktioniert es nicht. Ich habe das Problem schon etwas eingegrenzt. Er will keinen Primärschlüssel abhängig von einer IDENTITY-Spalte einer bereits gefüllten Tabelle machen.

Aber wie löse ich mein Problem am besten? Wer weiß was?

Bis denne und schon mal danke!
Schnoof

Moin, Schnoof,

die Konstellation

t1 (i1, f1, f2, …),
t2 (i1, i2, f1, f2, …)

mit t2.i1 als Fremdschlüssel aus t1 verlangt, dass t1.i1 existiert, bevor t2.i1 angelegt wird.

Gruß Ralf

Die Konstellation sieht genau genommen so aus:
t1 (i1, f1, f2, …),
t2 (i1, f1, f2, …),
t3 (i1, f1, f2, …)

Also i1 ist immer Primärschlüssel und im Falle von t2 und t3 gleichzeitig Fremdschlüssel auf t1.i1. Und natürlich existiert t1.i1 schon vor dem Bau von t2 und t3, denn diese Tabelle existiert eh schon. Es wird nur ein neuer Typ „t3“ eingeführt und die Einträge sind entweder vom Typ t2 oder vom Typ t3, es gibt aber eine Anzahl von Feldern, die bei beiden Typen äquivalent sind. Diese Felder werden in t1 stehen, der Rest wird auf t2 oder t3 verteilt. Der Schlüssel i1 wird in allen Tabellen jeweils eindeutig sein. Die Spalten f1 bis fn, die dann in t2 sind, werden ganz zum Schluss aus t1 gelöscht.

Ich kann ganz prima alles so anlegen wie ich will, wenn die Tabellen leer sind. Aber ich kann nicht nachträglich neue Tabellen anlegen und dort einen Fremdschlüssel auf eine IDENTITY-Spalte einer bereits existenten, gefüllten Tabelle definieren.

Die einzige Möglichkeit, die ich bisher gefunden habe, ist, alle Tabellen entsprechend neu anlegen, die Schlüssel so definieren, wie es jetzt nötig ist und erst dann die die Einträge aus den dann alten Tabellen übertrage. Dann müsste ich alte Tabellen löschen und einen Teil der neuen Tabellen umbenennen. Das ist, ehrlich gesagt, zu viel Aufwand, da es ja eigentlich auf oben beschriebene Weise auch funktionieren müsste.

Der Fehler von MS SQL Server ist folgender:
In der t1-Tabelle, auf die verwiesen wurde, befinden sich keine primären oder Kandidatenschlüssel, die mit der verweisenden Spaltenliste im FK__t2__i1__1AD3FDA4-Fremdschlüssel übereinstimmen.

Wie gesagt, dasselbe Vorgehen auf einer leeren Datenbank (also dieselbe bereits existente Datenbankstruktur mit leeren Tabellen) funktioniert einwandfrei ohne Fehler oder Warnungen.

Was muss ich tun, um mein Problem elegant zu lösen?

Danke!
Schnoof

Die Ursache des Problem liegt schon etwas früher … Vor der ganzen Schlüssel-Geschichte habe ich die Tabelle t1 noch umbenannt.
EXECUTE sp_rename ‚old1‘, ‚t1‘

Auf leeren Tabellen ist das scheinbar überhaupt kein Problem, aber bei gefüllten verschwinden die Einschränkungen und auch das IDENTITY. Das ist mir erst jetzt aufgefallen. Und dann ist natürlich kein Schlüssel mehr vorhanden.

Bis denne
Schnoof