1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  2. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

SQL Code - Welche Datenbank ?

Dieses Thema im Forum "Andere Datenbankserver" wurde erstellt von egosumquisum, 15 Juli 2010.

  1. egosumquisum

    egosumquisum Neuer Benutzer

    Arbeite gerade einen Kurs durch in dem folgendes erstes konkretes SQL Beispiel auftritt und habe bereits 2 Tage vergeblich damit verschwendet eine Datenbank zu finden die die Tabelle so anlegt wie es laut Codebeschreibung sein sollte :


    CREATE TABLE Personal(
    Persnr INT PRIMARY KEY,
    Name CHAR(25) NOT NULL,
    Ort CHAR(15),

    Vorgesetzt SMALLINT REFERENCES Personal
    ON DELETE SET NULL
    ON UPDATE CASCADE,
    .........................

    1.
    Da in meinem Kurs allgemein Datenbanken behandelt werden ist leider keine konkrete Datenbank zum durcharbeiten der Beispiele genannt.
    Für welche SQL Datenbank ist dieser Syntax ?
    MySQL(mit gesetztem ANSI-SQL Schalter) meckert zwar seltsamerweise nicht, legt hier aber ,laut Tabelleninspektor des "MySQL Query Browsers" ,(in dem ich den Code als Skript teste) keinen Fremdschlüssel für "Vorgesetzt" an
    und so werden auch die gestetzten Eigenschaften ON DELETE und ON UPDATE nicht übernommen.(Laut meinem KursSkript soll "Vorgesetzt" ein Fremdschlüssel sein der sich auf den Primärschlüssel der eigenen Relation bezieht)
    Lediglich Folgendes funktioniert bei mir in MySQL um diese Beziehung wie gewünscht zu modellieren(und nur wenn der Typ des referenzierten Fremdschlüssels identisch ist) :
    FOREIGN KEY (Vorgesetzt) REFERENCES Personal(Persnr)
    Ist MySQL(Verison 5.1) zum Durcharbeiten des Beipiels geeignet ?
    Welchem SQL Standard entspricht der im Kurs verwendete SQL-Code ?

    2.
    Kann Vorgesetzt nicht jeden def. Schlüsselwert von "Personal(Persnr)" annehmen?Wieso ist der Typ hier SMALLINT obwohl in "Personal(Persnr)" Integer Werte stehen könnten?


    Nachtrag :

    Habe das oben angeführte gegebene Beispiel nun als Skript mit SQL Server Management Studio auf einem SQL Server 2005 Express getestet. Erstmal wurde (wie ich mir dachte) der Datentyp moniert (da Datentyp des referenzierten Attributs nicht dem des referenzierendem
    entspricht). Gut OK dachte ich , vieleicht ein kleiner Fehler in dem Kurs ,also hab ich beide Typen konform zu INT gemacht...
    Allerdings meckert SQL Server Management Studio schon wieder wegen der Angabe der Einschränkungen für den Fremdschlüssel :



    Meldung 1785, Ebene 16, Status 0, Zeile 3
    Das Einführen der FOREIGN KEY-Einschränkung 'FK__Personal__Vorges__1B0907CE' für die 'Personal'-Tabelle kann Schleifen oder mehrere Kaskadepfade verursachen. Geben Sie ON DELETE NO ACTION oder ON UPDATE NO ACTION an, oder ändern Sie andere FOREIGN KEY-Einschränkungen.
    Meldung 1750, Ebene 16, Status 0, Zeile 3
    Die Einschränkung konnte nicht erstellt werden. Siehe vorherige Fehler.

    Doch kein Code für MS SQL Server ???? Oder meckert hier nur SQL Server Management Studio??
    Gibts dann vieleicht ne IDE und/oder nen anderen Server die bei diesem CodeBeispiel nicht meckern ,oder ist das Beispiel einfach nur falsch ??

    Danke im Vorraus für eure Zeit und schnelle Hilfe !
     
  2. thomas_w

    thomas_w Datenbank-Guru

    AW: SQL Code - Welche Datenbank ?

    Meiner Meinung nach ist das Beispiel fehlerhaft, bei der Fremdschlüssel sollte auch die entsprechende Spalte angegeben werden, denn woher sollte die Datenbank wissen, welche Spalten wie referenzieren.

    So geht es in ORACLE 10.2g
    Code:
    CREATE TABLE Personal(
     Persnr INT PRIMARY KEY,
     Name CHAR(25) NOT NULL,
     Ort CHAR(15),
     Vorgesetzt SMALLINT,
    [B]CONSTRAINT fk_personal_01[/B]
    [B]  FOREIGN KEY (vorgesetzt)[/B]
    [B]   REFERENCES Personal (persnr)[/B]
     ON DELETE SET NULL
    );
    
    Allerdings kann ORACLE (scheinbar) den doppelten ON DELETE ... und ON UPDATE ... nicht. Das muss ich aber nochmal prüfen.

    Vielleicht hilft die Info ja ein Stück weiter.

    EDIT
    Ich nehme die Aussage wieder zurück, mit einem Inline-Constraint müssen die referenzierenden Spalten nicht explizit angegeben werden.

    Code:
    CREATE TABLE Personal(
     Persnr INT PRIMARY KEY,
     Name CHAR(25) NOT NULL,
     Ort CHAR(15),
     Vorgesetzt SMALLINT REFERENCES Personal 
      ON DELETE SET NULL
    );
    

    Grüße
    Thomas
     
  3. akretschmer

    akretschmer Datenbank-Guru


    Damit hier eine Antwort steht: geht 'out-of-the-box' mit PostgreSQL:

    Code:
    test=*# CREATE TABLE Personal(
    test(# Persnr INT PRIMARY KEY,
    test(# Name CHAR(25) NOT NULL,
    test(# Ort CHAR(15),
    test(#
    test(# Vorgesetzt SMALLINT REFERENCES Personal
    test(# ON DELETE SET NULL
    test(# ON UPDATE CASCADE);
    NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "personal_pkey" for table "personal"
    CREATE TABLE
    Time: 49,411 ms
    
    Andreas
     
Die Seite wird geladen...

Diese Seite empfehlen