Delphi-PRAXiS
Seite 1 von 2  1 2      

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:44 Uhr.
Seite 1 von 2  1 2      

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