Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Problem mit Merge unter FB 3 (https://www.delphipraxis.net/212265-problem-mit-merge-unter-fb-3-a.html)

stalkingwolf 16. Jan 2023 08:47

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:
Invalid insert or update value(s): object columns are constrained - no 2 table rows can have duplicate column values
und danach den Violation of Primary Key vom Hauptschlüssel

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?

lxo 16. Jan 2023 08:57

AW: Problem mit Merge unter FB 3
 
Wie sieht denn dein Merge-Statement aus?

stalkingwolf 16. Jan 2023 09:23

AW: Problem mit Merge unter FB 3
 
Code:
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);
das ist etwas vereinfacht, weil es sind mehr Felder.
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.

lxo 16. Jan 2023 10:26

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?

dataspider 16. Jan 2023 10:30

AW: Problem mit Merge unter FB 3
 
Zitat:

Zitat von stalkingwolf (Beitrag 1517448)
Code:

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);

Hast du tatsächlich den Alias "a." mit in der Feldliste beim Insert?

Frank

lxo 16. Jan 2023 10:33

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:
https://firebirdsql.org/file/documen...nfb30-bug.html
https://github.com/FirebirdSQL/firebird/issues/6522

stalkingwolf 16. Jan 2023 14:17

AW: Problem mit Merge unter FB 3
 
Zitat:

Zitat von dataspider (Beitrag 1517452)
Zitat:

Zitat von stalkingwolf (Beitrag 1517448)
Code:

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);

Hast du tatsächlich den Alias "a." mit in der Feldliste beim Insert?

Frank

ne das war nur damit man es hier besser erkennt. Es ging mir um die Syntax. Relativ simple und funktioniert auch in der 2er Version.
bei dem Kunden haben wir die 3.0.9. Der Fehler liest sich anders. Dort crashed der gesamte SQL Server.

Zitat:

Zitat von lxo (Beitrag 1517450)
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?

Leider nichts gebracht.


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);

dataspider 16. Jan 2023 16:25

AW: Problem mit Merge unter FB 3
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von stalkingwolf (Beitrag 1517445)

Sobald ein Datensatz doppelt vorhanden ist, knallt es. und genau dafür soll das MERGE mit with not matching ja da sein.

Wo sind doppelte Daten? Auftrag oder Kundenstamm?
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?

stalkingwolf 16. Jan 2023 16:36

AW: Problem mit Merge unter FB 3
 
Zitat:

Zitat von dataspider (Beitrag 1517468)
Zitat:

Zitat von stalkingwolf (Beitrag 1517445)

Sobald ein Datensatz doppelt vorhanden ist, knallt es. und genau dafür soll das MERGE mit with not matching ja da sein.

Wo sind doppelte Daten? Auftrag oder Kundenstamm?
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?

Ja die passt. Wir machen morgen bei uns einmal ein Update. Weil ich habe das hier mit 3.0.9 auch. Andere Kundendatenbanken mit 2.5.1

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.

stalkingwolf 17. Jan 2023 11:19

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.

dataspider 17. Jan 2023 11:52

AW: Problem mit Merge unter FB 3
 
Kannst du eine MINI - DB zur Verfügung stellen, dann würde ich das mal testen...

Frank

IBExpert 18. Jan 2023 13:44

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 ;-)

stalkingwolf 19. Jan 2023 11:18

AW: Problem mit Merge unter FB 3
 
Zitat:

Zitat von dataspider (Beitrag 1517506)
Kannst du eine MINI - DB zur Verfügung stellen, dann würde ich das mal testen...

Frank

Ich versuche das nächste Woche mal. atm viel zu tun.

Frickler 19. Jan 2023 15:52

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.

stalkingwolf 20. Jan 2023 07:47

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 21:54 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz