![]() |
Datenbank: MaySQL • Version: 5.X • Zugriff über: Unidac
MySQL, Unidac und AutoInc
Hallo zusammen,
ich habe einen Masterdatensatz und im gleichen Bildschirm mehrere Detailsätze zu diesem Master. Die Daten stehen in einer MySQL DB Es wird UniDAC Verwendet Die P-Keys in der Tabelle sind Auto Inc Felder. Mein Problem ist folgendes: Wenn ich einen neuen Mastersatz anlege, aber noch nicht gespeichert habe, sind die P-Key Felder in der UniQuery leer. Diese werden erst nach dem Spichern gefüllt. Insofern kann, so lange der Mastersatz nicht gespeichert ist keine Detailsatz angelegt werden, da ich die Bindung noch nicht kenne. Hat jemad eine Idee ? Kann man die Masterquery irgendwie dazu bringen,,, den P-Key bereits zu kennen ? Ohne zu speichern ? Danke und Grüße |
AW: MySQL, Unidac und AutoInc
Da der Masterdatensatz in der Datenbank noch nicht existiert, funktioniert eine automatische Master/detailbeziehung erst nach dem Post des Masterdatensatzes.
|
AW: MySQL, Unidac und AutoInc
Keine Chance die ID früher (vor dem speichern) zu erfahren ?
Das Problem is folgendes: Es wir hier eine alte Access-DB auf MySQL umgestellt. Früher (mit Access und den GM-Dao Komponenten) war das scheinbar anders. Es sheit hier funkctioniert zu haben. Die Anpassung ist jetzt für mich tödlich viel Arbeit. Grüße und Danke |
AW: MySQL, Unidac und AutoInc
Mal eine einfache Frage:
Woher soll dein im Arbeitsspeicher, aber noch nicht in der Datenbank bestehende Datensatz wissen, welche ID von der DATENBANK beim speichern (post) vergeben wird? Denn zwischen deinem begin Edit des Masterdatensatzes und deinem POST kann von einem anderen Client bereits ein Post ausgeführt werden, dann währe deine ID gleich um 2 höher wie bei beginn des Edits.. Erst mit Post wird der Datensatz an die DB geschickt, erst dann wird die nächste ID per AutoInc vergeben. Dies war auch schon bei Access so, außer das die dort verwendeten Datenbank-Komponenten automatisch ein (internen) Post ausgeführt haben, wenn der Detailsatz erstellt wird. Oder es wurde eine PseudoID im Speicher verwendet, welches durch die DB-Komponente beim Post korrigiert wurde... Ich kenne keine Komponenten, die eine von der DB vergebenen ID schon im voraus 'reservieren' kann.. |
AW: MySQL, Unidac und AutoInc
Zitat:
|
AW: MySQL, Unidac und AutoInc
Liste der Anhänge anzeigen (Anzahl: 1)
Wozu mußt du die neue Id des Masterdatensatzes kennen, bevor du ihn gespeichert hast? Mach es doch so, daß die Detail-Datensätze erst angelegt werden, nachdem der Masterdatensatz erzeugt wurde. Je nach Datenbanksystem gibt es auch die Möglichkeit, den Trigger für das Erzeugen der Id bereits vor dem Insert auszulösen, so daß du schon vor dem Posten die neue Id weißt bzw. abrufen kannst. In IbExpert bzw. Firebird, meinem bevorzugten DBMS, sieht das so aus:
|
AW: MySQL, Unidac und AutoInc
Ein ClientDataSet verwendet in diesem Fall eine PseudoID (negative Werte)
|
AW: MySQL, Unidac und AutoInc
Also zuerst die Warnung, dann die Anwort:
Mit dem folgenden Vorschlag kannst Du in Teufelsküche kommen, wenn es nicht wasserdicht umgesetzt ist und es ist durchaus möglich, dass es gar nicht geht. Das musst Du also sauber prüfen, ob es theoretisch gemeinsam mit den Delphikomponenten Deinen Anwendungsfall abdeckt, ob es das praktisch auch tut (Mehrbenutzerumgebung, ...) und in Betracht ziehen, dass es keine wirkliche Lösung ist, denn normalerweise werden für soetwas andere Verfahren verwendet, die mysql aber nicht bietet. Wenn überhaupt, eignet sich der Kram unten eher für SQL Scripts, mglw. kann das auch innerhalb Deiner Komponenten transaktionssicher durchgeführt werden. Du kannst Dir 1. in mysql aus dem Information Schema den nächsten Auto Increment Wert je Tabelle holen und Du kannst 2. die zuletzt vergebene ID abfragen. Daraus kannst Du ggF. das zusammensetzen, was Du brauchst: Nächste AutoID
Code:
SELECT AUTO_INCREMENT
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'myDB' AND TABLE_NAME = 'myTable';
Code:
LAST_INSERT_ID(); /*bzw*/ SELECT LAST_INSERT_ID();
|
AW: MySQL, Unidac und AutoInc
Zitat:
Gruß K-H |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz