Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Create Table mit Schwierigkeiten...

Dieses Thema im Forum "PostgreSQL" wurde erstellt von TLoZOoT, 3 Januar 2013.

  1. TLoZOoT

    TLoZOoT Benutzer

    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^^
     
  2. akretschmer

    akretschmer Datenbank-Guru

    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".
    
    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

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



    Andreas
     
  3. TLoZOoT

    TLoZOoT Benutzer

    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
     
  4. akretschmer

    akretschmer Datenbank-Guru

    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
     
  5. akretschmer

    akretschmer Datenbank-Guru


    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
     
  6. TLoZOoT

    TLoZOoT Benutzer

    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^^
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden