Diskussion:Einführung in SQL: Beispieldatenbank

Aus Wikibooks
Zur Navigation springen Zur Suche springen

Erzeugen der Datenbank[Bearbeiten]

Hallo, mal eine Frage: Ist plsql so maechtig, dass ich mit diesen 3 Zeilen

 CREATE TABLE ABTEILUNGEN ...

die Beispieldatenbank anlegen kann? Ich glaube nicht, oder? ;) Mehr befindet sich leider nicht in der Datei hinter dem vorhandenen Oracle 9i/10g link [3]


Nein, leider nicht. Bei den Skripten fehlt generell die Erstellung der Datenbank selbst:

 CREATE DATABASE ...

Ich werde sehen, dass ich auch das ergänze. Juetho 09:32, 28. Apr. 2009 (CEST)[Beantworten]

Krähenfuß-Notation[Bearbeiten]

Mir ist die Krähenfuß-Notation offenbar nicht genügend geläufig:
- Manche Relationen werden gestrichelt dargestellt, andere mit durchgezogener Linie - hat das eine Bedeutung?
- Manche Relationen haben beidseitig Krähenfüße, ich nehme an, es handelt sich um m:n-Relationen, und die Mittler-Tabelle wurde weggelassen - richtig?
- Mir fehlt eine relation zw. Vertrag und Fahrzeug

Gibt es irgendwo einen Verweis, wo die Notation erklärt wird?

Außerdem verstehe ich (noch?) nicht den Sinn der Entität "Versicherungsgesellschaft" - sollen denn mehrere Versicherungsgesellschaften verwaltet werden? --ErfinderDesRades 19:33, 2. Okt. 2009 (CEST)[Beantworten]

Ich schlage vor, die gesamte Diskussion über RDBMS und die Beispieldatenbank auf der Hauptseite Diskussion:Einführung in SQL fortzuführen. Die Argumente, die ErfinderDesRades hier und vor allem unter Relationale Datenbanken gebracht hat, sind so grundlegender Natur, dass sie Auswirkungen auf das gesamte Buch haben. Ich möchte es deshalb auf der Hauptseite zusammengefasst diskutieren. -- Juetho 10:50, 3. Okt. 2009 (CEST)[Beantworten]
erledigt durch geänderten Aufbau des Schemas. -- Juetho 13:15, 1. Dez. 2009 (CET)[Beantworten]

Erstellungsscript 'MySQL' - Fehler - Abbruch[Bearbeiten]

Ich habe ein Problem mit dem Script. Ich benutze MySql 5.1.39 auf win32. (Loopback 127.0.0.1) Mein Frontend ist 'HeidiSQL 4.0' Die Datenbank heißt 'wikiversicherung'

Wenn ich das Script ausführe, bekomme ich folgende Fehlermeldung inmitten der Ausführung: ... Zeile96: INSERT INTO MITARBEITER (PERSONALNUMMER, NAME, VORNAME, GEBURTSDATUM, TELEFON, MOBIL, EMAIL, RAUM, IST_LEITER_J_N, ABTEILUNG_ID) VALUES ('120002', 'Baber', 'Yvonne', '1957-10-02', '0234/66012002', NULL, 'Yvonne.Baber@unserefirma.de', '62', 'N ', 12) ; Zeile97: INSERT INTO DIENSTWAGEN (KENNZEICHEN, FARBE, FAHRZEUG_TYP_ID, MITARBEITER_ID) SELECT 'DO-WB 42' || Abteilung_ID, 'elfenbein', 14, ID FROM Mitarbeiter WHERE Ist_Leiter_J_N = 'J' ; Zeile98: /* SQL Error: Truncated incorrect DOUBLE value: 'DO-WB 42' */

mache ich was falsch ? :) ich sehe mich ausserstande den Fehler, wo auch immer er ist, zu beheben, denn leider habe ich so gut wie keine Ahnung von SQL :p -- Wolf391 17:13, 25. Okt. 2009 (CET)[Beantworten]

Hmm, das ist in der Tat etwas mysteriös, vor allem der Verweis auf einen DOUBLE-Wert. Weder in Mitarbeiter noch in Dienstwagen kommt dieser Datentyp vor. Das Problem könnte darin liegen, dass der INTEGER-Wert aus Abteilung_ID entgegen der üblichen Erwartung nicht automatisch in einen CHAR- bzw. VARCHAR-Wert konvertiert werden kann. Zur Erläuterung siehe Einführung in SQL: Funktionen#Implizite Konvertierung. Bitte versuche diesen Befehl wie folgt (nach Kap.12.3 der Referenzdokumentation geändert):
 INSERT INTO DIENSTWAGEN (KENNZEICHEN, FARBE, FAHRZEUG_TYP_ID, MITARBEITER_ID)
      SELECT CONCAT('DO-WB 42', Abteilung_ID), 'elfenbein', 14, ID 
        FROM Mitarbeiter 
       WHERE Ist_Leiter_J_N = 'J' ;
Unabhängig davon, wie es zum Laufen gebracht wird, muss ich mehrfach um Entschuldigung und Verständnis bitten: Ich selbst arbeite nur mit Firebird; die Vergleiche mit MySql habe ich nach der Dokumentation vorgenommen; das MySql-Skript habe ich nach diesen 'Kenntnissen' überarbeitet: Zurzeit befasse ich mich noch mit den Inhalten, damit das Buch als solches fertig wird; erst danach will ich die Skripte für die verschiedenen DBMS überarbeiten, fertigstellen und testen. Außerdem wäre es sehr sinnvoll, fertige Datenbanken bereitzustellen, damit ein Anfänger nicht gleich mit solch einem Problem konfrontiert wird.
Übrigens: Bitte unterzeichne deine Beiträge mit -- ~~~~. Ich wundere mich, dass das nicht direkt angegeben wird. -- Juetho 17:54, 25. Okt. 2009 (CET)[Beantworten]

Vielen Dank für die schnelle Antwort. Tut mir leid wegen der fehlenden Unterzeichnung - ich rede mich da mal wegen 'Newbie' raus :) Ich verstehe dass für Sie die Reihenfolge der Wichtigkeiten als Author durchaus eine andre ist als für mich, der ich buchstäblich Tage gebraucht habe, bis ich endlich einen Ansatz zum Verstehen von SQL fand - nämlich Ihren :p. Daher auch mein Entschluß überhaupt einen Beitrag zu Ihrem Projekt zu posten.

Ich habe das Script nach obigen Angaben korrigiert. 2 Zeilen später gibt es die nächste Fehlermeldung aufgrund desselben Fehlers, die ich jedoch (hoffentlich richtig) korrigieren konnte. Hier der gesamte geänderte Abschnitt:

1. Änderung

/* Basisdaten: für jeden Abteilungsleiter ein Dienstwagen */
INSERT INTO DIENSTWAGEN (KENNZEICHEN, FARBE, FAHRZEUG_TYP_ID, MITARBEITER_ID)
     SELECT CONCAT ('DO-WB 42', Abteilung_ID), 'elfenbein', 14, ID FROM Mitarbeiter WHERE Ist_Leiter_J_N = 'J';
/* Basisdaten: ein paar weitere Dienstwagen */
INSERT INTO DIENSTWAGEN (KENNZEICHEN, FARBE, FAHRZEUG_TYP_ID, MITARBEITER_ID)
  VALUES ('DO-WB 111', 'elfenbein', 16, NULL);

2. Änderung

INSERT INTO DIENSTWAGEN (KENNZEICHEN, FARBE, FAHRZEUG_TYP_ID, MITARBEITER_ID)
  SELECT CONCAT ('DO-WB 3', Abteilung_ID, SUBSTRING(PERSONALNUMMER from 5 for 1)),
         'gelb', SUBSTRING(PERSONALNUMMER from 5 for 1), ID
    FROM Mitarbeiter
   WHERE Abteilung_ID in (5, 8)
     AND Ist_Leiter_J_N = 'N';

Nachdem dies bereinigt war, gab es noch einmal weiter hinten eine Fehlermeldung, weil einmal MITARBEITER, ein andermal MITARBEITER_ID verwendet wurde.

3. MITARBEITER geändert zu MITARBEITER_ID

create table VERSICHERUNGSVERTRAEGE
	(ID integer not null auto_increment primary key,
	VERTRAGSNUMMER varchar(20) not null,
	ABSCHLUSSDATUM date not null,
	ART char(2) not null, 
	MITARBEITER_ID integer not null,
	FAHRZEUG_ID integer not null,
	VERSICHERUNGSNEHMER_ID integer not null
	);

Nach der Änderung im 'create table VERSICHERUNGSVERTRAEGE' lief es dann problemlos. Hoffe das ich mich verständlich gemacht habe und es weiterhilft :) - Wolf391 13:43, 26. Okt. 2009 (CET)[Beantworten]

Danke recht herzlich für diese Mitarbeit. Ich werde diese Erfahrung mit CONCAT und die anderen Fehler bei der Überarbeitung selbstverständlich berücksichtigen. Aber solche Erfahrungen machen es erst recht dringend erforderlich, dass eine fertige Datenbank zum Download angeboten wird. -- Juetho 13:53, 26. Okt. 2009 (CET)[Beantworten]

Perl: Beispielskript für Testdaten[Bearbeiten]

In der Vergangenheit war folgender Absatz im Buch enthalten:

Im Buch Perl-Programmierung gibt es ein Beispielskript, das ebenso eine große Menge Datensätze in die Beispieldatenbank einfügt. Dadurch stehen erheblich mehr Datensätze bereit als im "Erstellungsskript", sodass Abfragen praxisnäher ausgeführt werden. Mit MySQL auf einem UNIX/LINUX-System führen sie "perl beispielskript.pl|mysql -u Datenbankbenutzer -p MeineDatenbank" durch, und schon kann eine Abfrage ein Ergebnis erzeugen.

Dieses Skript habe ich an die geänderten Tabellen und Spalten angepasst. Dabei habe ich festgestellt, dass nur ein Teil der Tabellen überhaupt berücksichtigt wird – vor allem weder Fahrzeuge noch Verträge – und die Beziehungen z.B. zwischen Schadensfällen und Fahrzeugen ebenso fehlen.

Ich habe deshalb mit schlechtem Gewissen den Verweis auf dieses Skript hier gestrichen. Ersatzweise sind ähnliche Verfahren in Testdaten erzeugen enthalten. -- Juetho 13:15, 1. Dez. 2009 (CET)[Beantworten]