![]() |
Datenbank: Firebird • Version: 3 • Zugriff über: flamerobin
Problem mit Merge unter FB 3
Moin,
ich wollte mit Merge aus einer Tabelle in eine andere schreiben. Das funktioniert auch mit 2.5.* aber unter Firebird 3. erhalte ich eine Meldung
Code:
und danach den Violation of Primary Key vom Hauptschlüssel
Invalid insert or update value(s): object columns are constrained - no 2 table rows can have duplicate column values
lt Netz soll ein gbak das Problem lösen, aber das macht es nicht. Sobald ein Datensatz doppelt vorhanden ist, knallt es. und genau dafür soll das MERGE mit with not matching ja da sein. Jemand schon einmal in das Problem gelaufen und weiß wie man das löst? |
AW: Problem mit Merge unter FB 3
Wie sieht denn dein Merge-Statement aus?
|
AW: Problem mit Merge unter FB 3
Code:
das ist etwas vereinfacht, weil es sind mehr Felder.
merge into KUNDENSTAMM a
using ( select KDNR,NAME,VORNAME,STRASSE,ORT,PLZ,TELEFON,EMAIL from AUFTRAG where coalesce(b.KDNR,'') <> '' group by KDNR,NAME,VORNAME,STRASSE,ORT,PLZ,TELEFON,EMAIL ) b on (coalesce(rtrim(a.KDNR),'') = coalesce(rtrim(b.KDNR),'')) when not matched then insert (a.KDNR,a.NAME,a.VORNAME,a.STRASSE,a.ORT,a.PLZ,a.TELEFON,a.EMAIL) values (b.KDNR,b.NAME,b.VORNAME,b.STRASSE,b.ORT,b.PLZ,b.TELEFON,b.EMAIL); KDNR ist das Haupffeld in KUNDENSTAMM und kann in AUFTRAG mehrfach vorhanden sein. Gleiche Tabelle mit gleichem Inhalt in FB 2.5.* funktioniert und in 3.* nicht. |
AW: Problem mit Merge unter FB 3
Hast du mal probiert bei der Datenmenge die du in USING verwendest (Quelltabelle) nach dem Primarykey zu sortieren aus deiner Zieltabelle?
Also in dem Fall nach KUNDENNR? |
AW: Problem mit Merge unter FB 3
Zitat:
Frank |
AW: Problem mit Merge unter FB 3
Welche Firbird 3 Version benutzt du?
Da gab es wohl auch Probleme mit MERGE, wurde in der Version 3.0.6 behoben. Siehe: ![]() ![]() |
AW: Problem mit Merge unter FB 3
Zitat:
bei dem Kunden haben wir die 3.0.9. Der Fehler liest sich anders. Dort crashed der gesamte SQL Server. Zitat:
Wenn ich das Ding kürze auf das notwendigste geht es immer noch nicht. Beide Felder varchar 15. IMO funktioniert not matched nicht.
Code:
merge into KUNDENSTAMM as a
using AUFTRAG as b on a.KDNR = b.KDNR when not matched then insert (KDNR) values (b.KDNR); |
AW: Problem mit Merge unter FB 3
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
KUNR in Kundenstamm ist Primary Key? Ich habe in einer Test DB das mal nachgestellt. (FB 3.0.10) Alle Varianten funktioniert es ohne Murren. So funktioniert es, Wenn ich AUFTRAG nicht gruppiere (also in der Quelle doppelte KUNR' s habe) als auch wenn ich in der Zieltabelle mehrere Datensätze mit gleicher KUNR habe. Die beim Kunden installierte und verwendete fbclient.dll passt exakt zur Server - Version? |
AW: Problem mit Merge unter FB 3
Zitat:
KDNR ist in Kundenstamm Primary Korrekt. Kann aber in AUFTRAG mehrfach vorkommen. Dafür ist not matching ja gedacht. Und wie gesagt funktioniert auch in anderen, viel größeren, Datenbanken mit 2.5.1 ohne Problem. Und jede Datenbank welche mit 2.5.1 funktioniert wir mit gbak nach 3.0.9 rüber ziehen und es dort den MERGE starten gibt es das Problem. Ich berichte morgen um es was gebracht hat. Weil sonst habe ich ein Problem :-) update or insert aus select will Firebird ja nicht implementieren und verweist auf MERGE. |
AW: Problem mit Merge unter FB 3
auch mit der 3.0.10 funktioniert es nicht.
Ich habe mir nun die Tabelle AUFTRAG aus 3.0.10 per copy as insert mit Flamerobin rausgezogen. In eine Datenbank welche noch mit 2.5.* läuft eingespielt. Dort läuft der Merge. Habe mir dann aus KUNDEN das wieder per copy as insert rausgezogen und in die 3.0.10 eingespielt. |
AW: Problem mit Merge unter FB 3
Kannst du eine MINI - DB zur Verfügung stellen, dann würde ich das mal testen...
Frank |
AW: Problem mit Merge unter FB 3
ich für mich persönlich weiss schon warum ich freiwillig noch keinen einzigen merge befehl benutzt habe, sondern so eine
aufgabe mit ein paar variablen, die aus einer for select schleife mit der eingangsmenge gefüllt werden, umsetze und ich dann in der schleife nach welchen seltsamen anforderungen auch immer dann in if then else .... entscheiden kann, ob es insert, update, delete order gar nichts machen muss. und das ganze in einem "execute block" erzeugt auch keine dauerhaften metadaten objekte, kann mit nahezu jeder tquery dann auch vom clients aus gestartet werden. die variablen die man braucht ebenso wie die sqls, sind zumindest in der software, die ich dafür benutze schnell zusammengeklickt und wenn es es nicht so läuft wie man meint kann man das da auch noch debuggen ;-) |
AW: Problem mit Merge unter FB 3
Zitat:
|
AW: Problem mit Merge unter FB 3
Gibt es einen weiteren Unique Key der damit geupdatet wird - außer der Kundennummer? BEFORE/AFTER INSERT Trigger auf der Kundentabelle?
Ich habe versucht, das nachzustellen. Die ganzen COALESCE Aufrufe habe ich so interpretiert, dass beide KDNR Felder nicht "NOT NULL" sind (geht eigentlich gar nicht bei Primary Key; aber vielleicht ist das nur logisch einer, aber nicht datenbanktechnisch. Deswegen habe ich in der Kundentabelle das UNIQUE Constraint gesetzt statt PRIMARY KEY, dann geht auch NULL als KDNR, auch multiple Datensätze mit NULL). Dann in beiden Tabellen auch Einträge mit KDNR = NULL drin, aber ich bekomme den Fehler nie. |
AW: Problem mit Merge unter FB 3
unique not null KUNDENSTAMM aber in AUFTRAG muss es nicht gefüllt sein.
Es war eigentlich nur um ganz sicher zu sein. Ich bau nächste Woche mal eine kleine fdb zusammen. Vermutlich wird es dann darin funktioniere :-D Aber wie gesagt in 2.5.* funktioniert es mit exakt den gleichen Daten. Und in keiner unsere Kundendatenbank welche auf 3.* läuft funktioniert der Merge. Ich habe ja nachher nur die KUNDENNUMMER und NACHNACME gesetzt damit ich ausschließen kann es liegt an einem anderen Feld. Aber es ist eh auf keinem anderen Feld unique drauf. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:38 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