Trigger

Josette

Benutzer
Beiträge
6
Hi Leute, hab mal wieder eine Frage bezüglich Integritätserhaltung meiner MySQL Datenbank. Ich habe 3 Tabellen mittels MySQL implementiert:

Studenten mit StudentenID (PK), VName, NName, Adresse, BuchID (FK)
Professor mit ProfessorID (PK), VName, NName, BuchID (FK)
Buch mit BuchID (PK), Name, Author, Genre

Jedes Buch gibt es nur einmal und kann daher nur einmal entlehnt werden. Wie könnte ich das implementieren? Habe an eine Trigger gedacht aber da kann ich keine zwei Tabellen miteinander in Verbindung bringen. Ich bin totale Anfängerin und freue mich über jede Hilfe. Es geht hier nur ums reine Lernen und eine Fantasiedatenbank. Danke euch schon mal im Voraus!
 
Werbung:
Naheliegend wäre (Realworld), dass es meinetwegen jedes Buch nur einmal gibt, aber perspektivisch mehrfach, wie in einer richtigen Bücherei.
Damit würdest Du eine Spalte Menge einführen, die in Deinem Szenario immer mit 1 gefüllt ist, wenn das Buch da ist.
Entleihen erfolgt dann per Menge=Menge-1, Rückgabe über Menge=Menge+1

Eine Spalte oder Information "Entleihbar" wäre entsprechende "where Menge>0".

Wenn Du unbedingt was mit Triggern machen möchtest oder darauf bestehst, dass es jedes Buch nur einmal gibt, dann sag Bescheid.
 
Das Tabellendesign ist trotzdem falsch - auch wenn es jedes Buch nur einmal gibt, kann sich ein Student ja wohl zwei verschiedene Bücher gleichzeitig ausleihen?
 
hier mal eine einfache Realisierung mit Inventarnummer für jedes Buch, eine Person kann auch mehrere Bücher ausleihen und kein Buch kann mehrfach ausgeliehen werden. Dazu Spalte 'aktiv'. Auf die Inventarnummer bei Ausleihe setzen ich einen bedingten unique constraint, der nur für aktiv=true gilt:

Code:
postgres=# create table person(id int primary key, name text);
CREATE TABLE
postgres=# create table buch(inventarnummer int primary key, name text);
CREATE TABLE
postgres=# create table ausleihe (wer int references person, buch int references buch, aktiv bool);
CREATE TABLE
postgres=# create unique index idx_ausleihe on ausleihe (buch) where aktiv;
CREATE INDEX
postgres=# insert into person values (1, 'ich');
INSERT 0 1
postgres=# insert into person values (2, 'du');
INSERT 0 1
postgres=# insert into buch values (1, 'buch 1');
INSERT 0 1
postgres=# insert into buch values (2, 'buch 2');
INSERT 0 1
postgres=# insert into ausleihe values (1,1,true);
INSERT 0 1
postgres=# insert into ausleihe values (2,1,true);
ERROR:  duplicate key value violates unique constraint "idx_ausleihe"
DETAIL:  Key (buch)=(1) already exists.
postgres=#
 
Hi Danke erst mal für eure schnellen Hilfen und Anmerkungen. Das Design ist weit weg von richtig, aber es handelt sich nur um eine Fantasiedatenbank. Ich kann vl auch ein anderes Beispiel geben, damit es realistischer ist. Nehmen wir zB die folgenden Tabellen

Flugzeug (InventarNr PK, Jahr der Fertigung, Flugschreibercode)
Techniker (LizenzenNr PK, Grad der Ausbildung, TypenNr FK)
Pilot (PilotenscheinNr PK, Anzahl der Flugstunden)
T_entlehnen (LizenzenNr PK + FK, Flugschreibercode PK + FK)
P_entlehnen (PilotenscheinNr PK + FK, Flugschreibercode PF + FK)

Jedes Flugzeug hat dabei eindeutig einen Flugschreiber (definiert durch den Flugschreibercode). Piloten ODER Techniker können Flugschreiber zur Auswertung entlehnen. Ich weiß einfach nicht, wie ich die Entlehnen Tabellen realisieren kann mit MySQL.
 
Werbung:
Jedes Flugzeug hat dabei eindeutig einen Flugschreiber (definiert durch den Flugschreibercode). Piloten ODER Techniker können Flugschreiber zur Auswertung entlehnen. Ich weiß einfach nicht, wie ich die Entlehnen Tabellen realisieren kann mit MySQL.
das ist sehr ähnlich wie mit dem Buch: ein Flugschreiber kann nur einmal entnommen werden, siehe mein Beispiel.
Ach ja: ich verwende PostgreSQL, das kann einiges mehr als MySQL. Wenn Du a) sauberes SQL mit einer b) modernen Datenbank lernen willst, dann nehme dazu kein MySQL, sondern lieber PostgreSQL. MySQL ist einfach nur eine Ansammlung von Bugs und fehlenden Features.
 
Zurück
Oben