Create Table mit Schwierigkeiten...

TLoZOoT

Benutzer
Beiträge
6
Nabend zusammen ;-)

Meine Aufgabe lautet wiefolgt:

verwalten: Die Attribute "Name" und "ImmobilienID" bilden gemeinsam den Schlüssel. Es gilt außerdem: Als Wert für das Attribut "Name" darf nur ein Wert eingesetzt werden, der in einem Tupel der Relation "Immobilienmakler" als Wert des Attributs "Name" vorkommt und als Wert für das Attribut "ImmobilienID" darf nur ein Wert eingesetzt werden, der in einem Tupel der Relation "Immobilien" als Wert des Attributs "ImmobilienID" vorkommt.

Klingt, dachte ich, relativ leicht - ist es für mich aber iwie noch nicht...

Ich weiß einfach nicht, wie ich für Name überprüfe, ob in der anderen Tabelle dieser Wert (Name) schon in der Spalte Name ist.

Hier die Create Statements für die anderen beiden Tabellen, auf die referenziert werden soll:


CREATE TABLE Immobilienmakler
(
name VARCHAR PRIMARY KEY,
auto VARCHAR );

CREATE TABLE Immobilien
(
immobilienID INTEGER CHECK (immobilienID <=8) PRIMARY KEY,
wohngebiet VARCHAR,
wohnflaeche INTEGER NOT NULL,
balkonTerassenFlaeche INTEGER CHECK ( balkonTerassenFlaeche > 0 ) );

Hoffe mir kann da jemand helfen...

Was mir gerade noch einfällt... Bei dem Create Table Statement für die Tabelle Immobilien gilt folgendes:


Der Schlüssel ist "ImmoblienID"; zur Speicherung werden maximal 8 Ziffern
benötigt.

wobei gilt:
dom(Immobilien-ID) = dom(Wohnfläche) = dom(BalkonTerrassenfläche) =Int

Ich weiß aber nicht, wie ich einen Integer Wert begrenzen kann auf 8 Ziffern - ist vermutlich sehr simpel das Problem, aber ich find dazu gerade nichts... Wäre nett, wenn ihr mir dazu auch noch helfen könntet^^
 
Werbung:
Nabend zusammen ;-)

Meine Aufgabe lautet wiefolgt:

verwalten: Die Attribute "Name" und "ImmobilienID" bilden gemeinsam den Schlüssel. Es gilt außerdem: Als Wert für das Attribut "Name" darf nur ein Wert eingesetzt werden, der in einem Tupel der Relation "Immobilienmakler" als Wert des Attributs "Name" vorkommt und als Wert für das Attribut "ImmobilienID" darf nur ein Wert eingesetzt werden, der in einem Tupel der Relation "Immobilien" als Wert des Attributs "ImmobilienID" vorkommt.

Klingt, dachte ich, relativ leicht - ist es für mich aber iwie noch nicht...

Ich weiß einfach nicht, wie ich für Name überprüfe, ob in der anderen Tabelle dieser Wert (Name) schon in der Spalte Name ist.
Bist nah dran ;-)

Wichtig ist, daß da ein PRIMARY KEY drauf ist. Auf diesen kann man REFERENCES setzen:

Code:
test=# create table makler(name text primary key);
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "makler_pkey" for table "makler"
CREATE TABLE
test=*# create table verwalten(name text references makler);
CREATE TABLE
test=*# insert into makler values ('akretschmer');
INSERT 0 1
test=*# insert into verwalten values ('akretschmer');
INSERT 0 1
test=*# insert into verwalten values ('TLoZOoT');
ERROR:  insert or update on table "verwalten" violates foreign key constraint "verwalten_name_fkey"
DETAIL:  Key (name)=(TLoZOoT) is not present in table "makler".

Der Schlüssel ist "ImmoblienID"; zur Speicherung werden maximal 8 Ziffern
benötigt.


Ich weiß aber nicht, wie ich einen Integer Wert begrenzen kann auf 8 Ziffern - ist vermutlich sehr simpel das Problem, aber ich find dazu gerade nichts... Wäre nett, wenn ihr mir dazu auch noch helfen könntet^^

Nun, wenn da max. 8 Ziffern erlaub sind, dann geht noch 99999999, aber nicht mehr 100000000 ... Du siehst den Weg?

Code:
test=# create table max_int(i int check (i < 100000000));
CREATE TABLE
test=*# insert into max_int values (99999999);
INSERT 0 1
test=*# insert into max_int values (100000000);
ERROR:  new row for relation "max_int" violates check constraint "max_int_i_check"
DETAIL:  Failing row contains (100000000).

Gut, um es ganz sauber zu machen sollte man noch prüfen, daß die ID > 0 ist, das überlasse ich Dir nun zur Übung.

Was Du mit

wobei gilt: dom(Immobilien-ID) = dom(Wohnfläche) = dom(BalkonTerrassenfläche) =Int

meinst weiß ich nicht, daher geh ich darauf nicht ein.



Andreas
 
Heho ;-) Vielen Dank für deine Antwort - ich werde das nachher mal ausprobieren, wenn ich dann die Zeit dazu habe ;-) Aber klingt alles logisch und relativ leicht umzusetzen ;)

Das ist der Datentyp, unser Informatikprof macht das immer so, weiß nicht ob das so allgemein ist... Domain eben...^^ Heißt im Grunde nur, dass die 3 Spalten alle den Datentyp Integer haben müssen

dom(Immobilien-ID) = dom(Wohnfläche) = dom(BalkonTerrassenfläche) =Int
 
Ahhh versteh, ja, CREATE DOMAIN. Ja, wenn man es akademisch korrekt will, dann so ;-)
http://www.postgresql.org/docs/9.1/static/sql-createdomain.html


Andreas


Also, ich will das ned lächerlich oder so machen, die Strenge, die PG da anlegt, ist einfach Klasse. Also, man kann wirklich jede Menge Validitätsprüfung von Daten bereits in die Definition der Tabelle unterbringen. Das hat viele, sehr viel Vorteile. Und für mich ist gerade diese Fähigkeit von PG der entscheidende Unterschied zu z.B. MySQL.


Andreas
 
Werbung:
Keine Angst ;-) Ich hab auch nicht gedacht, dass du des lächerlich machen möchtest :-P

Ich hab da selber noch nicht so viel Ahnung von (machen SQL jetzt seit 2 Wochen...) darum nie schlecht, da ein bisschen mehr zu verstehen und zu wissen. Von CREATE DOMAIN hab ich auch noch nix gehört, jetzt weiß ich jedenfalls wofür das genau steht^^
 
Zurück
Oben