• Liebe User, bitte beachtet folgendes Thema: Was im Forum passiert, bleibt im Forum! Danke!
  • Hallo Gemeinde! Das Problem leidet zurzeit unter technischen Problemen. Wir sind da dran, aber das Zeitkontingent ist begrenzt. In der Zwischenzeit dürfte den meisten aufgefallen sein, dass das Erstellen von Posts funktioniert, auch wenn das Forum erstmal eine Fehlermeldung wirft. Um unseren Löschaufwand zu minimieren, bitten wir euch darum, nicht mehrmals auf 'Post Reply' zu klicken, da das zur Mehrfachposts führt. Grußworte.

Table erstellen mit SQL Befehl

Crusher-ScT-

Guest
Hi,

ich will folgendes DB Schema per SQL Befehl in einer Oracle DB erstellen.

Auto (Kennzeichen , Fabrikat, Modell, PS, Erstzulassung, km_Stand, Kosten_je_km)

Kunde (KDNR, Name, Adresse)

Mietvertrag (KDNR, Auto, von, bis, Preis, bezahlt?, km_gefahren)

Also grundsätzlich hab ich kein Probleme Tables erstellen, aber in Mietvertrag ist ja als Spaltenname "Auto" angegeben. Und da raff ich nicht wie ich das in den SQL Befehl reinbringen muss.

Mit Reference hab ich es versucht, aber das will irgendwie nicht. Vielleicht mach ich da auch was falsch.

Kann jemand helfen ?

Gruss Crusher
 
Mitglied seit
03.08.2002
Beiträge
3.257
Reaktionen
14
"auto" bekommt noch einen Spaltennamen namens "id" oder "pk" oder sowas, was der "Primary Key" wird. Ich weiss jetzt aber nicht, wo du das Oracle klarmachen musst. In MySQL / phpMyAdmin geht es halt direkt beim Table erstellen, PostgrSQL musste man Key mit Autoincrement getrennt anlegen und Key benennen.

Also da musst du mal nachschlagen, wie in Oracle Keybehandlung
ist.

Zumindest steht in der Tabelle "Mietvertrag" dann im Feld Auto nur die Id des jeweiligen Autos und ein SQL Befehl läuft so:

SELECT Mietvertrag.*, Auto.Modell FROM Mietvertrag JOIN Auto in Mietvertrag.Auto = Auto.id

So ist es aber noch nicht ganz sauber, da ein Mieter theoretisch 2 Autos haben könnte. Deswegen würde ich es andersum bauen:

Tabelle Auto hat noch ne Spalte "Besitzer" oder "Mieter" drin, wo auf die id von Kunde gezeigt wird. (eigentlich benennt man normalerweise alle Namen klein und macht etwas eindeutigere Namen a la kunde_id wenn auf Tabelle kunde, Feld id gezeigt wird)

bzw ganzganz sauber:

Es gibt noch ne Tabelle Kunde_Auto mit den Feldern id, Kunde_id, Auto_id.

Jetzt vom SQL Befehl direkt kann ich dir nicht helfen, da ich nicht weiss, wie Oracle Keys halt verwaltet, aber es sollte doch auch für Oracle irgendwelche Admin Tools geben ...
 
Mitglied seit
12.08.2002
Beiträge
12.549
Reaktionen
0
ohne garantie weil aus dem kopf und so ;p

create table auto
(kennzeichen varchar(15),
fabrikat varchar(50),
modell varchar(50),
ps integer,
erstzulassung date,
km_stand number(7,2),
kosten_je_km number(3,2),
primary key(kennzeichen))

create table kunde
(kdnr integer,
name varchar(50),
adresse varchar(100),
primary key(kdnr))

Mietvertrag (KDNR, Auto, von, bis, Preis, bezahlt?, km_gefahren)
create table mietvertrag
(vertragsnummer integer primary key,
kdnr integer references kunde(kdnr),
kennzeichen varchar(15) references auto(kennzeichen),
von date,
bis date,
preis number(4,2),
km_gefahren number(6,2))
 

Crusher-ScT-

Guest
hmmm

also das DB Schema kann nicht geändert werden. Ist aus einer alten Klausur. :)

Kennzeichen ist der Primary Key bei Auto. Habe nochmal oben die Schlüssel unterstrichen.

Wie gesagt mein Problem ist nur wie lege ich praktisch eine ganze Tabelle (die Tabelle Auto) als Key bei der Table "Mietvertrag" an.

Die ersten beiden Tabellen haben ja eindeutige Primarey Keys, aber die Table Mietvertrag hat ja 2 Schlüssel. :(
 
Mitglied seit
12.08.2002
Beiträge
12.549
Reaktionen
0
Original geschrieben von BiBaButzemann
"auto" bekommt noch einen Spaltennamen namens "id" oder "pk" oder sowas, was der "Primary Key" wird.

da hast du allerdings recht. kennzeichen können ja mal wechseln etc (überführung usw)

Original geschrieben von BiBaButzemann

So ist es aber noch nicht ganz sauber, da ein Mieter theoretisch 2 Autos haben könnte. Deswegen würde ich es andersum bauen:

Tabelle Auto hat noch ne Spalte "Besitzer" oder "Mieter" drin, wo auf die id von Kunde gezeigt wird.

argh, das ist total umständlich ..
warum willst du das so machen?
dann hast du zig tabellen (auto, mietvertrag) die du pflegen mußt weil sich eine sache ändert (der aktuelle besitzer) anstatt nur einen eintrag bei den verträgen zu machen. ein mieter kann doch auch so wie es jetzt ist mehrere autos mieten ..

Original geschrieben von BiBaButzemann

Es gibt noch ne Tabelle Kunde_Auto mit den Feldern id, Kunde_id, Auto_id.
und was ist daran ganz sauber?
du lagerst ja damit nur aus der mietvertragstabelle aus ohne dort wirklich redundanzen zu beseitigen weil da ja gar keine sind ..
 

Crusher-ScT-

Guest
um das DB schema brauch ich mir keine gedanken zu machen .. wird eh vorgegeben. :)

Danke für die 3 Befehle .. werde sie morgen mal ausprobierten wenn ich in meiner FH bin. :)
 
Mitglied seit
02.08.2002
Beiträge
2.781
Reaktionen
0
also ich würde grundsätzlich alle tabellen, die in anderen tabellen nocheinmal referenziert werden mit einem primary key "id" anlegen - da umgehst du teilweise viele probleme und brauchst auch in der abfrage nicht so viel nachdenken :) aber wenns dir vorgegeben ist musste es wohl so lösen...
 

Crusher-ScT-

Guest
naja ... ob jetzt noch eine ID hinzugefügt werden würde oder nicht .. bzw. zusätzlich zum Kennzeichen würde ja für mein P
roblem keine änderung ergeben.

Ich habe ja das Problem das eine Spalte kein typischer Datentyp ist wie VARCHAR sondern vom Typ Auto.
 
Mitglied seit
12.08.2002
Beiträge
12.549
Reaktionen
0
ach du willst/sollst den constraint auf die ganze auto tabelle legen?
 
Mitglied seit
03.08.2002
Beiträge
3.257
Reaktionen
14
Es geht darum, Probleme einzeln zu behandeln.

In Auto sollten wirklich nur Autodetails drin sein.
In Kunde nur Kundendaten.

Z.B. kann es aber vorkommen, dass Kunden das selbe Auto fahren (z.B. irgendn n Fiat) und für den Fiat nicht nochmal ne identische Tabellenzeile angelegt werden muss.

In Kunde_Auto werden dann den Kunden ein oder mehrere Autos zugewiesen.

Sonst könntest ja direkt in Kunde auch seine Autodaten mit reinschreiben, was dann ne riesige _lahme_ Tabelle ergibt.
 

Crusher-ScT-

Guest
Original geschrieben von Trashpilot
ach du willst/sollst den constraint auf die ganze auto tabelle legen?

naja .. constraint .. also Bedingung würde ich es nicht nennen.

Ich will nur das DB Schema anlegen was ich ganz oben gepostet habe. d.h. keine neuen Attribute einfügen wie "ID" für Mietvertrag. Das ist einfach net vorgesehen.

Und Mietvertrag hat z.b. die Attribute "von" und "bis" mit dem Typ date. UND das Attribut "Auto", welches ja kein Datentyp darstellt wie VARCHAR oder INT sondern praktisch vom typ Auto(der ersten Tabelle) sein soll.

Nochmal: ES geht NICHT darum ein DB Schema sich auszudenken, welches vielleicht das beste ist. Das interessiert nicht. Es muss genau das erstellt werden was ich ganz oben gepostet habe mit den unterstrichenen Schlüsseln.

Und da bräuchte ich (eigentlich nur für die Tabelle Mietvertrag) den SQL Befehl zum createn.
 
Mitglied seit
12.08.2002
Beiträge
12.549
Reaktionen
0
dann sollte das hier schon reichen:

create table mietvertrag(
index number references auto,
kdnr integer references kunde(kdnr),
von date,
bis date,
preis number(4,2),
km_gefahren number(6,2)
primary key (index,kdnr)
);

Original geschrieben von BiBaButzemann
Es geht darum, Probleme einzeln zu behandeln.

In Auto sollten wirklich nur Autodetails drin sein.
In Kunde nur Kundendaten.

Z.B. kann es aber vorkommen, dass Kunden das selbe Auto fahren (z.B. irgendn n Fiat) und für den Fiat nicht nochmal ne identische Tabellenzeile angelegt werden muss.

In Kunde_Auto werden dann den Kunden ein oder mehrere Autos zugewiesen.

Sonst könntest ja direkt in Kunde auch seine Autodaten mit reinschreiben, was dann ne riesige _lahme_ Tabelle ergibt.
die verbindung kunde/auto steht doch schon eindeutig im vertrag .. wozu willst da jetzt bitte noch eine tabelle die quasi zu 50% aus dem mietvertrag besteht aber ansonsten genau die gleichen einträge hat? :stupid:
 

Crusher-ScT-

Guest
hmm thx, aber was ist index ? Schlüsselwort das ich benötige oder ein neues Attribut ?
 
Mitglied seit
12.08.2002
Beiträge
12.549
Reaktionen
0
index kannst du auch sonstwie nennen wie es dir beliebt .. aber nach wie vor ohne anspruch auf gültigkeit wenn es deinem lehrer nicht paßt oder so ;p
 

Crusher-ScT-

Guest
naja .. irgendwie glaub ich du weisst net was ich will. :)

das DB Schema soll nicht verändert werden, also keine neuen Attribute wie Index ....
 
Mitglied seit
12.08.2002
Beiträge
12.549
Reaktionen
0
das ist ja kein neues attribut sondern die referenz zu auto ..
 

Crusher-ScT-

Guest
aber ich trotzdem dann eine neue Spalte mit dem namen index .. also muss ich bei der neuerstellung immer eine nummer für den index angeben oder ?
 
Mitglied seit
12.08.2002
Beiträge
12.549
Reaktionen
0
irgendwie mußt du ja drauf verweisen .. zaubern kann oracle (noch) nicht.
 

Crusher-ScT-

Guest
ok

hab nun die tables erstellt. Alles geklappt.

Noch eine frage ..

ich will Assertions über Trigger simulieren.

Code:
CREATE Trigger test1
BEFORE INSERT on mietvertrag
FOR EACH ROW
WHEN (new.auto.erstzulassung > new.von)
BEGIN
.........
end;

der geht so nicht .. Frage: Warum nicht ?

Kann ich überhaupt auf Sachen von der Tabelle auto zu greifen ?
 
Oben