View Full Version : skip foreign key?
Hallo!
Gibt es eine Möglichkeit in SQL beim Insert in Tabellen, die Foreign Key Constraints haben, die Sätze mit Constraintviolation einfach zu überspringen?
Das sind Datensätze die keiner mehr braucht.
Möchte das nicht händisch bei 50+ Dateien machen müssen.
Lg Peter
... where exists könnte dein Freund sein!
D*B
Hallo!
Gibt es eine Möglichkeit in SQL beim Insert in Tabellen, die Foreign Key Constraints haben, die Sätze mit Constraintviolation einfach zu überspringen?
Das sind Datensätze die keiner mehr braucht.
Möchte das nicht händisch bei 50+ Dateien machen müssen.
Lg Peter
Das Problem dabei ist, dass ich in meinem Daten-Übernahmeprogramm nicht auf where exists abfragen kann weil ich dort noch nicht weiß welche Constraints ziehen.
Erzeuge mir aus den systables und syscolumns meine Insertstatements.
Kann man beim "Anlegen" der Constraints vielleicht sowas wie "delete violated" sagen? Dann würd ich die Tabellen vor anlegen der Constraints füllen.
Hintergrund:
Es existiert eine Anwendung die aus 50+ physischen Files besteht, diese werden von DDS auf DDL geändert, Constraints angelegt und Datums- und Zeitfelder (8P 0/6P 0) auf echte Datums und Zeitfelder geändert.
Die RPGs dahinter wurden schon auf FREE konvertiert und werden an die "neuen Umstände" angepasst.
Mfg Peter
Warum klemmst Du die Constraints (disabled) nicht vor dem Kopieren ab und aktivierst sie nach dem Füllen wieder.
Über den iSeries Navigator kann man das mit ein paar Mouseclicks erledigen.
Ungültige Constraints gehen nach dem aktivieren in einen Pending Status, der dann manuell berarbeitet werden kann.
Birgitta
... warum weiß man das nicht, die constraints sind auch im repository drin? Die Fremdschlüssel müssen doch bekannt sein und wenn man in der richtigen Reihenfolge arbeitet kann man mit where exists füllen.
Wenn man für die foreign key Felder null zulässt (was sich empfiehlt), dann kann man die auch zunächst ungefüllt lassen und im Nachgang per update skript hochziehen.
Constraints später anlegen? dann gehen die Dateien auf check pending und dann wirds fummelig, da ist es besser die Arbeit im Vorfeld in die Skripten reinzustecken. Programme helfen da auch wenig, da kann man zwar die violations übergehen, aber bei falscher Reihenfolge fehlen am Ende dann Sätze!
D*B
Das Problem dabei ist, dass ich in meinem Daten-Übernahmeprogramm nicht auf where exists abfragen kann weil ich dort noch nicht weiß welche Constraints ziehen.
Erzeuge mir aus den systables und syscolumns meine Insertstatements.
Kann man beim "Anlegen" der Constraints vielleicht sowas wie "delete violated" sagen? Dann würd ich die Tabellen vor anlegen der Constraints füllen.
Hintergrund:
Es existiert eine Anwendung die aus 50+ physischen Files besteht, diese werden von DDS auf DDL geändert, Constraints angelegt und Datums- und Zeitfelder (8P 0/6P 0) auf echte Datums und Zeitfelder geändert.
Die RPGs dahinter wurden schon auf FREE konvertiert und werden an die "neuen Umstände" angepasst.
Mfg Peter
Warum klemmst Du die Constraints (disabled) nicht vor dem Kopieren ab und aktivierst sie nach dem Füllen wieder.
Über den iSeries Navigator kann man das mit ein paar Mouseclicks erledigen.
Ungültige Constraints gehen nach dem aktivieren in einen Pending Status, der dann manuell berarbeitet werden kann.
Birgitta
Das wars!! :D
Ach kann das Leben manchmal einfach sein ... :)
... warum weiß man das nicht, die constraints sind auch im repository drin? Die Fremdschlüssel müssen doch bekannt sein und wenn man in der richtigen Reihenfolge arbeitet kann man mit where exists füllen.
Wenn man für die foreign key Felder null zulässt (was sich empfiehlt), dann kann man die auch zunächst ungefüllt lassen und im Nachgang per update skript hochziehen.
Constraints später anlegen? dann gehen die Dateien auf check pending und dann wirds fummelig, da ist es besser die Arbeit im Vorfeld in die Skripten reinzustecken. Programme helfen da auch wenig, da kann man zwar die violations übergehen, aber bei falscher Reihenfolge fehlen am Ende dann Sätze!
D*B
Diesen Weg werde ich mir auch mal durchdenken, vielleicht brauch ich das ja noch öfter. :rolleyes:
... das Mäusekino brauchst du nicht, da gibt es auch den (einfacheren) chgpfcst - aber dann???
... musst du zu Fuss nachsehen, wo das klemmt, per händisch erstelltem SQL Sätze mit where not exists rausfeuern, wieder CHGPFCST zum aktivieren und dieser Zyklus kann dir bei der Auftragsdatei für Kunde, Lieferant, Artikel, Adresse, Lieferadresse mehrfach passieren (und auch noch iterativ - Kunde fliegt wegen Constraint raus, lässt sich aber nicht entfernen, weil er in Auftrag drinhängt...) das ist schnell angefangen und beschäftigt dich Tage...
D*B
Das wars!! :D
Ach kann das Leben manchmal einfach sein ... :)
... das Mäusekino brauchst du nicht, da gibt es auch den (einfacheren) chgpfcst - aber dann???
... musst du zu Fuss nachsehen, wo das klemmt, per händisch erstelltem SQL Sätze mit where not exists rausfeuern, wieder CHGPFCST zum aktivieren und dieser Zyklus kann dir bei der Auftragsdatei für Kunde, Lieferant, Artikel, Adresse, Lieferadresse mehrfach passieren (und auch noch iterativ - Kunde fliegt wegen Constraint raus, lässt sich aber nicht entfernen, weil er in Auftrag drinhängt...) das ist schnell angefangen und beschäftigt dich Tage...
D*B
Und du hast recht, ist doch nicht so einfach wie es ausgesehen hat, vor allem sind vieeele auf pending.
Werd mir eine Steuerdatei anlegen in der die Tabellen in richtiger Reihenfolge stehen und dort SQL-Statements hinterlegen.
Schade ... :(