SQL Code - Welche Datenbank ?

egosumquisum

Neuer Benutzer
Beiträge
2
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 !
 
Werbung:
AW: SQL Code - Welche Datenbank ?

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

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
 
Werbung:
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,
.........................


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
 
Zurück
Oben