DerbyDB - Bedingtes Insert

steppi

Commander
Registriert
Apr. 2012
Beiträge
2.158
Hallo Zusammen,

ich habe ein Studienprojekt, wo ich mit NetBeans und einer Derby-DB arbeiten muss.

Ich habe drei Tabellen, wobei Tabelle 3 aus dem PK, jeweils dem PK von Tab1 und Tab2 besteht (als Foreign Key) + einer weiteren Spalte.

Die Tabelle habe ich so erstellt:

Code:
CREATE TABLE Tab3
(
   t3id INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1) CONSTRAINT PK_Tab3 PRIMARY KEY,
   t1id INTEGER REFERENCES Tab1(t1id),
   t2id INTEGER REFERENCES Tab2(t2id),
   anzahl INTEGER
);

Jetzt hatte ich bereits "Standard-Inserts" in der Form

insert into tab3 (... , .... , .... )
Values ( ..., ... , ...);

gemacht, was auch funktioniert.


Im nächsten Schritt soll jetzt t1id, t2id, anzahl in Tab3 geschrieben werden.
Vorher soll geprüft werden, ob der t1id und t2id in Tab1 und Tab2 überhaupt exisitiert.

Ich hatte jetzt gefunden, dass man in das Insert into mit Select ... From ... Where Bedingungen knüpfen kann. Hier ist jetzt die Frage, muss ich hier mehrere Selects machen für jede Bedingung einzeln und loglisch mit && verknüpfen? Wie bringe ich die Anzahl mit ins Spiel. Ich hatte jetzt immer nur gefunden, wie man eine Abfrage auf eine andere Tabelle macht und das Ergebnis dann in die neue Tabelle schreibt.
 
P.S.
Kann ich auch einfach sowas machen.... (in sehr kurz)

IF Exists (select t1id from tab1) then
insert into ....
End IF

??
 
steppi schrieb:
Vorher soll geprüft werden, ob der t1id und t2id in Tab1 und Tab2 überhaupt exisitiert.

nimmt man fuer sowas nicht einfach Fremdschluessel? Das sollte doch beim INSERT dann fehlschlagen wenn ein Wert in der Primaertabelle nicht existiert. Oder verstehe ich das Problem einfach nur nicht?
 
  • Gefällt mir
Reaktionen: steppi
@abcddcba
Fremdschlüssel habe ich bereits drin und die funktionieren soweit auch.
Und ja wenn ich einen Wert nehme, der im FK nicht vorhanden ist kommt ein Fehler.

[Exception, Error code 30.000, SQLState 23503] INSERT in Tabelle 'Tab1' hat für Schlüssel (10) den Fremdschlüssel-Constraint 'SQL210902201612351' verletzt. Die Anweisung wurde zurückgesetzt.

In der Aufgabe steht aber:

"Hinweis: prüfen Sie im Vorfeld, welche KID und AID in den Tabellen Tab1 und Tab2 existieren, da es sonst zu SQL-Fehler kommen kann."

Kann auch sein, dass ich das einfach falsch deute, was zutun ist. Vlt. soll ich auch vorher einfach ein Select machen, mir die Tabelle anschauen und mir ein Beispiel raus suchen. Ich hätte jetzt versucht irgendwie was zu codieren in die Richtung IF EXISTS .... then Insert ... Values...

 
Grundsätzlich sind die contraints in einer DB dazu da, sicherzustellen dass die Beziehungen zwischen den gespeicherten Datensätzen korrekt sind, sozusagen das letzte Fallnetz bevor was schief geht.

Folgende Möglichkeiten fallen mir auf die Schnelle ein:
  • Einfach inserten und den Fehler abfangen.
    Wird für einfache Probleme auch durchaus so gemacht, wobei ich es vermeide.
  • In der Anwendungslogik zuerst abfragen, dann inserten (in einer Transaktion)
    Ist für komplexe Probleme oft notwendig, vor allem bei der Verwendeung eines ORM tools.
  • SQL MERGE verwenden (MERGE Statement)
    Währe vermutlich die eleganteste Lösung für dein Problem.
 
  • Gefällt mir
Reaktionen: steppi
Ich weiß nicht, ob ich's richtig verstehe und was der Dozent genau sehen will, aber ich würde wohl ein INSERT-SELECT über ein Kreuzprodukt (in manchen DBMS heißt es CROSS JOIN) machen, wo ich einschränke (WHERE): Tab1.t1id = literalfuert1 AND Tab2.t2id = literalfuert2. Gibt's die jeweiligen IDs in den Tabellen Tab1 bzw. Tab2, wird in Tab3 eine Zeile erzeugt, sonst nicht. So sparst du dir Programmierung und feuerst nur Wald-und-Wiesen-DML-Statements.
 
  • Gefällt mir
Reaktionen: steppi
Erstmal vorab, ich habe einfach ein Select gemacht und beschrieben, dass ich eine der angezeigten IDs für das selbstgewählte Beispiel nutze. Hab auch mittlerweile das Ding mit 100/100 Punkten und einer 1.0 zurück.

@Ortan
Ich hatte es Anfangs wie du gedeutet.
Über die Anwendungslogik wäre meine Alternative gewesen, war aber in diesem Sinne garnicht möglich/ gefragt, da das Insert nicht über die Oberfläche/ API realisiert werden sollte. Das Insert sollte einfach "Hardcoded" an der DB ausgeführt werden. (Eigentlich ein Witz für eine Aufgabe innerhalb eines Studiums, aber OK die Klausur dazu kommt noch)

SQL Merge hatte ich mir angesehen, da war ich aber irgendwie im Verständnis noch etwas hinterher. Die beiden Values aus den FK wären klar gewesen, aber das dritte Value das "neu" dazu kommt, da hatte ich so meine Probleme.

@mental.dIseASe
Auch das hatte ich kurzzeitig in den Gedanken, aber da hatte ich schon die Bemerkung erhalten, dass das was ich da versuche garnicht Teil der Aufgabe, sondern nur ein Hinweis ist.

Ich danke euch Allen, auch für die Ansätze und ich denke auch, dass das nicht umsonst war, da sicher noch eine Studienarbeit kommt die objektorientierte Progr., Web und Datenbanken sicher vereinen wird mit mehr Komplexibilität und Tiefgang.
 
  • Gefällt mir
Reaktionen: mental.dIseASe
Zurück
Oben