-
Reihenfolge der Datensatzverarbeitung beim SQL-Update
Hallo,
in welcher Reihenfolge werden beim SQL-Update die Datensätze verarbeitet? Geht es hier nach der relativen Satznummer?
Ich habe folgenden Fall. Ich möchte in einer Tabelle die Satznummer aller Datensätze um 1 erhöhen mit folgendem SQL:
update myfile set satznummer = satznummer + 1
Die Satznummer ist Bestandteil des Unique-Key der Tabelle. Beim Aufruf erhalte ich den Fehler, dass versucht wird doppelte Sätze zu schreiben. Jetzt hab ich gesehen, dass der Datensatz mit der Satznummer 1 eine niedrigere relative Satznummer hat als der mit Satznummer 2. Und deshalb vermute ich jetzt mal, dass der Satz mit Satznummer 1 zuerst verarbeitet wird und deshalb der Fehler auftritt. Habe ich Recht mit meiner Vermutung?
Gruß,
KM
-
Wenn's von der Feldgröße passt ...
update datei set Satznr = Satznr + 'Anzahl Sätze der Datei'
update datei set satznr = satznr + 1 - 'Anzahl Sätze der Datei'
Robi
Das Notwendige steht über dem technisch machbaren.
(klingt komisch, funktioniert aber!)
-
Zitat von KM
Hallo,
in welcher Reihenfolge werden beim SQL-Update die Datensätze verarbeitet? Geht es hier nach der relativen Satznummer?
Die Antwort lautet an dieser Stelle ganz klar: "it depends"
Wenn Du alle Datensätze in der Tabelle ändern willst, wir vermutlich ein TableScann erfolgen und die Daten in Eingangsfolge verarbeitet.
Wenn Du jedoch WHERE-Bedingungn hast, kann es sein, dass auf die Daten am Schnellsten mit Hilfe eines Indices zugegriffen werden kann. In diesem Fall wird vermutlich ein Index Scan (oder Index Probe) erfolgen, bevor auf die Daten zugegriffen wird (Table Probe)
... und dann ist auch nicht sicher, dass die Daten in der Reihenfolge verarbeitet werde, in der Du sie gerne verarbeitet hättest.
Um die Satz-Nr. zu verändern, kannst Du wie Robi vorgeschlagen hat 2 Updates machen.
1. Du addierst die Anzahl der Datensätze zu der Satz-Nr. hinzu
2. Im zweiten Durchlauf subtrahierst du die Anzahl der Datensätze wieder und addiiert 1 dazu.
Wenn nur ein laufender Zähler gebildet werden, soll, die Reihenfolge in der die Nr. vergeben wird, jedoch egal ist, kannst Du mit einem SEQUENCE-Object arbeiten.
Code:
z.B. Update ...
Set Nr = NEXT VALUE FOR SequenceName
...
Ansonsten bleibt Dir nur die Einzel-Satz-Verarbeitung, also CURSOR mit entsprechendem ORDER BY (Absteigende Reihnfolge, damit es keine doppelten Schlüssel gibt) im Select-Statement und dann den Update über WHERE CURRENT OF Cursor.
Birgitta
-
Zitat von KM
Hallo,
in welcher Reihenfolge werden beim SQL-Update die Datensätze verarbeitet? Geht es hier nach der relativen Satznummer?
Ich habe folgenden Fall. Ich möchte in einer Tabelle die Satznummer aller Datensätze um 1 erhöhen mit folgendem SQL:
update myfile set satznummer = satznummer + 1
Die Satznummer ist Bestandteil des Unique-Key der Tabelle. Beim Aufruf erhalte ich den Fehler, dass versucht wird doppelte Sätze zu schreiben. Jetzt hab ich gesehen, dass der Datensatz mit der Satznummer 1 eine niedrigere relative Satznummer hat als der mit Satznummer 2. Und deshalb vermute ich jetzt mal, dass der Satz mit Satznummer 1 zuerst verarbeitet wird und deshalb der Fehler auftritt. Habe ich Recht mit meiner Vermutung?
Gruß,
KM
Die Reihenfolge kannst Du bei einem Bulk nicht beeinflussen - wie wärs mit CHGPFCST constraint disable, dann Dein bulk statement dann wieder chgpfcst.
D*B
-
@Alle: Danke für die Antworten!
@BenderD: Bei der Tabelle ist gar kein Constraint hinterlegt.
Gruß,
KM
-
... wo kommt dann der doppelte Schlüssel her?
-
... wo kommt dann der doppelte Schlüssel her?
Da liegt jetzt vielleicht ein Missverständnis vor. Das Feld "Satznummer" gehört zu den Key-Feldern der Tabelle und diese wurde mit dem DDS-Schlüsselwort "UNIQUE" erstellt. Es gibt aber keine Constraints, die jetzt explizit mit ADDPFCST hinzugefügt wurden. Mit WRKPFCST werden zu dieser Tabelle auch keine angezeigt.
Gruß,
KM
-
Wenn Dir die relative Satznummer bei Deinen Manipulationen hilft, die gibt es mit RRN(*) bzw. RRN(Tabellenbezeichner).
-
Wenn Dir die relative Satznummer bei Deinen Manipulationen hilft, die gibt es mit RRN(*) bzw. RRN(Tabellenbezeichner).
Das ist mir bekannt. Aber die hilft mir ja beim Update hier nicht.
Gruß,
KM
-
Wenn der Key bereits in der PF liegt (per DDS), kann man den leider nicht deaktivieren.
Ist der Key in einer LF kann man diese löschen und nach dem Update neu erstellen.
Ansonsten hast du ja die Möglichkeiten mit dem doppelten Update.
Wenn du des Rechnens müde bist, geht das auch so:
1. Update mit SatzNr = 0 - SatzNr
2. Update mit SatzNr = 0 - SatzNr + 1
Similar Threads
-
By fpxx in forum NEWSboard Programmierung
Antworten: 1
Letzter Beitrag: 26-07-17, 14:38
-
By M.Heger in forum NEWSboard Programmierung
Antworten: 8
Letzter Beitrag: 16-09-16, 09:43
-
By Starocotes in forum IBM i Hauptforum
Antworten: 23
Letzter Beitrag: 19-05-15, 13:04
-
By KingofKning in forum NEWSboard Programmierung
Antworten: 8
Letzter Beitrag: 30-12-14, 19:53
-
By malzusrex in forum IBM i Hauptforum
Antworten: 1
Letzter Beitrag: 23-04-03, 17:15
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks