![]() |
Datenbank: PostgreSQL • Version: 8.1 • Zugriff über: PostgresDAC
LEFT OUTER JOIN Abfrage ok, aber INSERT Fehler
Ich habe eine PostgreSQL Datenbank, die mehrere Tabellen enthält. In der Haupttabelle sind verschiedene Felder die die ID-Nummer einer anderen Tabelle beinhalten. Das läst sich ja auch prima mit LEFT OUTER JOIN selectieren, um das in einem DBGrid vernünftig darzustellen. Soweit nix neues.
Delphi-Quellcode:
Klappt auch wunderbar. Nur beim Einfügen eines neuen Datensatz stört sich das Programm an einer Varible, die ja nicht in der einen Tabelle existiert.
'SELECT daten.*, kategorie.kname AS kname FROM daten '+
'LEFT OUTER JOIN kategorie ON daten.kat = kategorie.id '+ 'ORDER BY nummer ASC'; Zitat:
|
Re: LEFT OUTER JOIN Abfrage ok, aber INSERT Fehler
Wie versuchst Du denn, den Datensatz einzufügen? Das ist mir nicht ganz klar geworden.
|
Re: LEFT OUTER JOIN Abfrage ok, aber INSERT Fehler
Moin, moin,
Inserts in Joins sind zwar prinzipiell über Updateojekte möglich aber eher schwierig zu händeln. Neige dazu die Einzeltabelle mit einer zweiten Query zu öffnen (rw) und hier den Insert auszuführen und anschliessend den Join zu refreshen. Die Join -Query braucht dann nur als readonly geöffnet zu werden. Grüße // Martin PS: Das mit dem 'wie' scheint mir doch eine Fangfrage zu sein.. :mrgreen: |
Re: LEFT OUTER JOIN Abfrage ok, aber INSERT Fehler
Den Insert starte ich mittels Button:
Delphi-Quellcode:
Dann fülle ich die Textfelder aus und ein anschließendes
DM1.PSQLdaten.Append();
DM1.PSQLdaten.Edit; DM1.PSQLdaten.FieldByName('artnew').AsBoolean:=true; DM1.PSQLdaten.FieldByName('limited').AsInteger:=0;
Delphi-Quellcode:
bringt das ganze dann in die Datenbank.
DM1.PSQLdaten.Post;
|
Re: LEFT OUTER JOIN Abfrage ok, aber INSERT Fehler
Da gibt es drei Probleme
1. Wie generierst Du das Primärid-Feld der ersten Tabelle (AutoInc?) 2. Wie generierst Du das Primärid-Feld der zweiten Tabelle (AutoInc?) 3. Wie generierst Du das Referenzid-Feld der in der zweiten Tabelle __ mit dem ID-Wert des neu generierten Primärid-Wertes aus der ersten Tabelle? Grüße // Martin |
Re: LEFT OUTER JOIN Abfrage ok, aber INSERT Fehler
Ja beide Primary Keys sind Autoincrementale Felder unter PostgreSQL Sequenzen genannt.
SQL-Code:
Ein Referenzid-Feld habe ich nicht erstellt bzw verbinde ich es mittels JOIN Abfrage.
-- 1. Tabelle:
CREATE TABLE daten ( id serial NOT NULL, nummer character varying(12) NOT NULL, name character varying(60) NOT NULL, kat integer, limited integer, CONSTRAINT daten_pkey UNIQUE (id) ) -- 2. Tabelle CREATE TABLE kategorie ( id serial NOT NULL, kname character varying(32) NOT NULL, bild character varying(32), CONSTRAINT kategorie_pkey PRIMARY KEY (id) )
SQL-Code:
In der 2. Tabelle stehen nur 10 Datensätze und die jeweilige ID davon übernehme ich bei einem neuen Datensatz der Tabelle >daten< als Feld >kat<. Ich versteh nicht wo das Problem ist, da es meiner Meinung so üblich ist Daten miteinander zu verknüpfen. Wobei ich mich auch gerne eines besseren belehren lasse.
SELECT daten.*, kategorie.kname AS kname FROM daten
LEFT OUTER JOIN kategorie ON daten.kat = kategorie.id ORDER BY nummer ASC |
Re: LEFT OUTER JOIN Abfrage ok, aber INSERT Fehler
Eigentlich hatte ich auf ein vergessenes Referenzfeld gehofft. Aber dem ist nicht so.
Mit den Sequenzen (durfte ich mich neulich auch schon mal rumschlagen) ist alles in Ordnung. Damit liegt das Problem daran, dass die Zugriffskomponente (wie üblich bei Delphi) das Insert-Statement nicht richtig generiert. Ein typischer Knackpunkt ist die automatische generierung beim ID-Feld der zweiten Tabelle, wo viele Komponenten einfach den bisherigen Wert nochmal hineinschreiben möchten (ID-Crash), da die Komponenten nur das erste Feld als Autogeneriert annimmt. Manchmal ordnen Sie auch alle Felder der ersten Tabelle zu und kennen die zweite überhaupt nciht. Entweder man probiert das InsertStatement selbst zu generieren und trägt es dann über die "UpdateSQL-Komponenten" selber ein oder man nimmt zum Eintragen konsequent nur Eintabellenqueries. Grüße // Martin |
Re: LEFT OUTER JOIN Abfrage ok, aber INSERT Fehler
Ich habe jetzt nach langem Ausprobieren die "Selbstbau-Insert-Variante" genutzt. Dabei habe ich wieder einen Fehler entdeckt, wobei ich nicht weis, ob das ein allgemeiner Fehler oder von meiner Komponente ist. Alle Memofelder lassen sich komischerweise nicht automatisch einfügen, sondern müssen nochmal "gequoted" werden. Siehe Beispiel:
Delphi-Quellcode:
Danach reicht ein einfaches
DM1.PSQLdatenUpdate.InsertSQL.Clear;
DM1.PSQLdatenUpdate.InsertSQL.Add( 'INSERT INTO daten '+ ' ("nummer", "name", "kat", '+ ' "textde", '+ ' "datechanged") '+ 'VALUES '+ ' (:"nummer", :"name", :"kat", '+ QuotedStr(DM1.PSQLdaten.FieldbyName('textde').AsString)+', '+ ' :"datechanged") ');
Delphi-Quellcode:
und die Daten werden eingepflegt. Würde man die QuotedStr wieder in eine :"textde" umwandeln, meckert das Programm rum, das man keine Variable übergeben hat. Das tritt aber wie gesagt nur bei Memofeldern auf, bei den anderen nicht.
DM1.PSQLdaten.Post;
|
Re: LEFT OUTER JOIN Abfrage ok, aber INSERT Fehler
Ich kenn nur MySQL, daher weiß ich nicht, ob Postrgre vielleicht einen anderen Dialikt hat, aber wieso "LEFT OUTER JOIN"?
"LEFT JOIN" würde doch auch reichen. Edit: Außerdem wenn du willst, das die SekundärID aud jenen Primärschlüssel abgebildet wird und du keine Felder in der Tabelle hast, die keinen zuweisbaren IDWert haben, benutzt du am besten:
SQL-Code:
SELECT foo.bar, f.nord
FROM foo INNER JOIN f ON foo.ID = f.ID |
Re: LEFT OUTER JOIN Abfrage ok, aber INSERT Fehler
Ohne das OUTER würde der Datensatz nicht mehr angezeigt, wenn keine Zuordnung zwischen den Beiden Tabellen wäre. Aber selbst wenn ich alle Zuordnungen hätte, auch bei deinem Beispiel kann ich keinen Datensatz mit Delphi erzeugen. Sobald 2 Tabellen in der Abfrage sind, kann er die Felder aus der 2. Datenbank nicht finden - zumindest bei meiner PostgreSQL Komponente. Ob das unter MySQL auch so ist kann ich nicht sagen. Grundsätzlich entwickle ich Software für Kunden aus Lizenzrechlichen Gründen nur mit PostgreSQL.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:25 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 by Thomas Breitkreuz