Insert into procedure mit Bedingung

akretschmer

Datenbank-Guru
Beiträge
9.848
Deine Lösung habe ich leider aufgrund mangelnder Kenntnisse nicht verstanden.
Um die zweite Lösung noch kurz zu erklären:
* PostgreSQL hat eine RANGE-Datentyp. Da kannst Du sagen, im Zeitraum von - bis ist etwas belegt (z.B.), mit Angabe, ob die Grenzen inklusive oder exclusive sind. '[2022-08-12,2022-08-22)' z.B. ist vom 12.8. - 22.8., dabei ist der 12. inclusive (siehe '[') und der 22. exclusive (siehe ')')
* ich nutze einen GiST-Index, der kommt aus der Geometrie. Stelle Dir ein Koordinatensystem vor, wo X und Y jeweils das Datum ist. Trage einen Punkt bei X=Y=12.8. und einen bei X=Y=22.8. ein und verbinde das zu einem Rechteck
* der EXCLUSION-Constraint sagt: prüfe das werkzeug auf Gleichheit und den Zeitraum auf Überlappung. Es darf also keine Kombination gleiches Werkzeug UND einer Überlappung der Zeiträume geben.

Sagte ich schon, daß MySQL Lichtjahre davon entfernt ist, sowas zu können?
 
Werbung:

ukulele

Datenbank-Guru
Beiträge
4.702
@akretschmer liefert wieder mal eine tolle Lösung am Problem vorbei ;-) Ein Index kann zwar den Eintrag für eine Doppelbuchung elegant verhindern, die Anfrage ist aber eher wie man bei einer Auswahlmaske nur die Daten listet, die überhaupt in Frage kommen. Also es geht quasi erstmal um einen Select nach dem Motto: Gib mir alle Gegenstände die ich noch ausleihen kann.

Ob das jetzt mittels einer Prozedur in die DB geschrieben wird oder über INSERT Befehle, ich glaube du suchst schon beim Frontend nach einer Einschränkung, richtig?

Dazu muss man erstmal fest halten das die auszuleihenden Gegenstände natürlich im Bestand sein müssen aber es kommen ja auch die bereits vorhandenen Informationen im Frontend zum tragen wie z.B. ist der Ausleihzeitraum schon bekannt oder eventuell bekannt bzw. nicht bekannt und darauf aufbauend braucht es dann einen Select für die auszuleihenden Objekte. Eventuell gibt es auch mehrere identische Objekte die man nur einmal listen will, etc.

Wenn ich da richtig liege, wie genau befüllst du die Objektauswahl in der Maske vom Frontend, vermutlich ein simpler Select oder?
 

akretschmer

Datenbank-Guru
Beiträge
9.848
nun ja, in #1 stand:

Falls der Gegenstand schon verliehen ist, soll es nicht möglich sein diesen Gegenstand nochmals zu verleihen (bzw den Datensatz einzufügen).

Eine Auswahlliste zu genrieren anhand einer Inventarliste - dem, was gerade verliehen ist, würde ebenfalls von einem passenden Index profitieren.
 

OstapBender

Benutzer
Beiträge
13
Eine Liste vorhandener Mietgegenstände hab ich schon irgendwie hinbekommen (mithilfe von Access hab ich den SQL Code generieren können..) Hab ich natürlich über 3 Ecken irgendwie zusammengewurschtelt (Erst mal die vermieteten Gegenstände als code, dann alle Gegenstände - den vermieteten gegenständen). Geht vermutlich auch irgendwie eleganter...

SELECT tblGegenstaende.GegenstandID
FROM tblGegenstaende
WHERE (((tblGegenstaende.GegenstandID) Not In
(SELECT tblGegenstaende.GegenstandID
FROM tblGegenstaende INNER JOIN tblVermietungen ON tblGegenstaende.GegenstandID = tblVermietungen.vmtGegenstaendeID
WHERE (((tblVermietungen.VmtistRueckgabeDatum) Is Null)))))


Ich möchte quasi nur Gegenstände verleihen können, welche in dieser Auswahl vorhanden sind... ich bekomme meinen Befehl aber nicht auf die Reihe ;( Weder für einen normalen insert into, geschweige denn als procedure.
Wahrscheinlich seh ich den Wald vor lauter Bäumen nicht... oder bin einfach zu doof :D
Kann mir da jemand helfen?!
 

OstapBender

Benutzer
Beiträge
13
INSERT INTO tblVermietungen
values (vmtMieterID, vmtGegenstandID, vmtAbholungDatum, vmtPlanRueckgabeDatum)
Select vmtMieterID, vmtGegenstandID, vmtAbholungDatum, vmtPlanRueckgabeDatum
FROM
SELECT tblGegenstaende.GegenstandID
FROM tblGegenstaende
WHERE (((tblGegenstaende.GegenstandID) Not In
(SELECT tblGegenstaende.GegenstandID
FROM tblGegenstaende INNER JOIN tblVermietungen ON tblGegenstaende.GegenstandID = tblVermietungen.vmtGegenstaendeID
WHERE (((tblVermietungen.VmtistRueckgabeDatum) Is Null)))))


(Der untere rote Teil wäre ja die Tabelle mit vorhandenen, verleihbaren Gegenständen).

Sowas in die Art? Bin ich da auf dem halbwegs richtigen Weg?
 

akretschmer

Datenbank-Guru
Beiträge
9.848
ohne das jetzt nachzuvollziehen, aber die Abfrage aus #20 liefert Dir doch alle potentiell verleihbaren Dinge, warum willst Du diese in die Vermietungstabelle komplett einfügen?
 

ukulele

Datenbank-Guru
Beiträge
4.702
Also was du natürlich machen kannst ist sinngemäß
Code:
INSERT INTO tblVermietungen VALUES ...
SELECT ...
FROM <mögliche vermietungen>
WHERE / AND <gewünschte vermietung>
Das heißt du wählst alles aus was vermietbar ist und schränkst noch weiter ein auf das was dann lt. Frontend auch gemietet werden soll (also vermutlich genau ein Objekt).

Aber natürlich kann das Frontend erstmal sagen ich will Gegenstand X mieten, der ist dann nicht verfügbar dann werden einfach 0 Datensätze eingefügt. Das ist erstmal richtig aber führt zu keinem Feedback warum jetzt einfach "nichts" passiert.
 

OstapBender

Benutzer
Beiträge
13
Das rot geschriebene soll doch nur eingrenzen welche Gegenstände ich in die Tabelle einfügen kann, oder?

Die Tabelle Vermietungen beinhaltet alle Vermietungen die je getätigt wurden. Ich möchte ja immer nur eine Vermietung zusätzliche eintragen. Mit dem Befehl INSERT INTO, jedoch soll die Einschränkung gelten, dass er nur Gegenstände eintragen kann, die sich in der Tabelle befinden, welche mit ROT geschrieben erstellt wird.
 

OstapBender

Benutzer
Beiträge
13
Also was du natürlich machen kannst ist sinngemäß
Code:
INSERT INTO tblVermietungen VALUES ...
SELECT ...
FROM <mögliche vermietungen>
WHERE / AND <gewünschte vermietung>
Das heißt du wählst alles aus was vermietbar ist und schränkst noch weiter ein auf das was dann lt. Frontend auch gemietet werden soll (also vermutlich genau ein Objekt).

Aber natürlich kann das Frontend erstmal sagen ich will Gegenstand X mieten, der ist dann nicht verfügbar dann werden einfach 0 Datensätze eingefügt. Das ist erstmal richtig aber führt zu keinem Feedback warum jetzt einfach "nichts" passiert.

Genau. Wobei ich jetzt nicht mit einem Frontend arbeite (falls ich richtig verstehe was du mit einem Frontend meinst).
Ich will das nur über MySQL einfügen.
Das ein leerer Datensatz eingefügt wird, kann ich doch mit dem Ignore Zusatz verhindern, oder?

Den ganzen Insert Into code kann ich ja dann in eine Prozedur packen, oder? Ich verstehe nur nicht wie ich den Code dann logisch und syntaxtechnisch richtig schreiben muss.
 

OstapBender

Benutzer
Beiträge
13
Code:
INSERT INTO tblVermietungen VALUES ...
SELECT ...
FROM <mögliche vermietungen>
WHERE / AND <gewünschte vermietung>
Kann das rote weg? Weil es soll ja nur aus <mögliche vermietungen> ausgewählt werden können
 

OstapBender

Benutzer
Beiträge
13
Das ganze möchte ich dann in einer Procedur speichern, weil ich den ganzen Code ja nicht bei jeder Vermietung neu schreiben möchte (ich bin ja schon froh, wenn ich den Code einmal richtig hinbekommen würde :D )
 
Werbung:

dabadepdu

Datenbank-Guru
Beiträge
1.123
ein unique constraint auf GegenstandID und Rückgabedatum wird IMHO nicht verhindern, daß ein und derselbe Gegenstand mehrfach da auftaucht.
Der Gegenstand darf mehrfach dort drin stehen, aber nur einmal mit Null Wert im Datum. Ein Unique Constraint wäre also ok, aber mySQL kann das offenbar nicht. Das hätte ich nicht gedacht.

Die Einschränkung auf frei verfügbare Gegenstände ist dann wohl schon hilfreicher. Die muss auch nicht ständig neu abgefragt werden, dafür dürfte ein View reichen. Der das bei jeder Abfrage automatisch macht.
Bei der Gestaltung eines Formulars oder beim puren Insert hat man mit einem solchen View und den ungefilterten Daten jederzeit alle Reaktionsmöglichkeiten.

Bin ganz frisch dabei MySQL zu lernen.
Dann wäre noch die Frage, warum Du das lernen willst. Oder musst Du? Dir wird gerade auf 2 Seiten erklärt, was Du für Klimzüge machen musst und was du alles lernen musst, weil du ein System lernst, das einen relative geringen Funktionsumfang hat. Du lernst, mit Workarounds zu arbeiten und noch schlimmer, erhälst ein schiefes Bild von Datenbankgrundbegriffen, schlecht für Anfänger.
 
Oben