Derby/JavaDB Kleine DB mit Tabelle erweitern - Integrität - Alter-Table - Netbeans ...

Miu

Mitglied
Hallo alle zusammen,

ich schreibe gerade für mein Studium eine Java Anwendung. Diese Anwendung kommuniziert mit JavaDB. Kurz: Das Tool soll mehr oder weniger eine Studenten-Verwaltung sein. Man kann neue Studenten im System anlegen, sie zu Praktika bestimmter Module anmelden, ihnen Testate vergeben. Und dann hat es noch so nette Gimmicks dass man sich diese Daten visualisiert in verschiedenen Charts anzeigen lassen kann. Nach sehr viel Arbeit bin ich nun auch fertig mit der Implementierung der Methoden und Aufbereitung der Daten. Es funktioniert soweit alles.

Allerdings habe ich nun ein Problem. Wir haben eine "fast" fertig DB bekommen, welche im Zuge der Anwendungsprogrammierung erweitert werden soll um zwei Tabellen.

Java:
STUDENT { 
MATRIKEL VARCHAR(9)   <-- Primärkey
NAME VARCHAR(20)
VORNAME VARCHAR(20)
ADRESSE VARCHAR (200)
SKUERZEL VARCHAR(3)
}

PRAKTIKUMSTEILNAHME {
MATRIKEL VARCHAR(9)         <-- Sekundärschlüssel zur Tabelle STUDENT
MKUERZEL VARCHAR(5)        <-- Sekundärschlüssel zu einer Tabelle MODUL
SEMESTER VARCHAR (7)
TESTAT BOOLEAN
}

Das habe ich bislang einfach in Netbeans gemacht (Mit JavaDB verbunden, rechtsklick -> create Table) . Aus gutem Grund, denn 1. haben wir das anlegen von Tabellen über Code nie praktisch geübt - es ging immer nur um DB Abfragen und Updates. 2. Ist in unserem Einführungs-Paper für diese Aufgabe eben genau der Weg über Netbeans bebildert.

Jetzt meinte der Dozent aber aber letzte mal zu mir, dass ich die Identitätsbedingung sicherstellen muss. Stichwörter die dabei gefallen sind "Foreign Key", "Alter Table". Weiter nachhaken konnte ich nicht. Jetzt stehe ich da und bin verwirrt.

1. Ich weiß nicht was das ist, bzw. - ich weiß zumindest das "Alter Table" ein Alternativbefehl zu Create Table. Aber die Examples die ich dazu so im Internet finde überfordern mich.

2. Ich weiß gar nicht, ob ich das einfach nur "vergessen" habe und man dies eventuell sogar in Netbeans machen kann. Aber ich weiß nicht wie. Denn ich sehe da nur "Create Table" und dann steht da nichts über Alter Table oder Foreignkey

Kann mich hier jemand aufklären, wie dies zu verstehen und ggf. in Netbeans umzusetzen ist?

Ich bedanke mich und verbleibe ratlos :rtfm:

Liebe Grüße
Miu
 
Zuletzt bearbeitet:

VfL_Freak

Top Contributor
Moin,

ALTER TABLE ändert die Struktur einer Tabelle, die zuvor mit CREATE angelegt wurde (kommt vom Wort ALTERNATE)
SQL ALTER TABLE - 1Keydata SQL-Tutorial

Ein FOREIGN KEY ist ein sog. Fremdschlüssel, mit dem auf einen Eintrag einer anderen Tabelle verwiesen wird! So verweist in Deinem Fall eine Matrikelnummer auf einen Eintrag in der Tabelle STUDENT, d. h. du kannst die hierüber die Studenten-Stammdaten (Name etc.) holen

Gruß
Klaus
 

dzim

Top Contributor
Nachdem die Begrifflichkeiten dank Vfl_Freak nun endlich stimmen (so muss ich es nicht schreiben), meine Frage: Muss es Derby/JavaDB sein, oder hast du es nur ausgewählt, damit irgendetwas ausgewählt ist? Soll eine tatsächliche DB erstellt werden, oder ging es nur um die DDL?
 

Miu

Mitglied
ALTER TABLE ändert die Struktur einer Tabelle, die zuvor mit CREATE angelegt wurde (kommt vom Wort ALTERNATE)
SQL ALTER TABLE - 1Keydata SQL-Tutorial

Ein FOREIGN KEY ist ein sog. Fremdschlüssel, mit dem auf einen Eintrag einer anderen Tabelle verwiesen wird! So verweist in Deinem Fall eine Matrikelnummer auf einen Eintrag in der Tabelle STUDENT, d. h. du kannst die hierüber die Studenten-Stammdaten (Name etc.) holen

Vielen Dank für die Antwort.
Ich bin immer noch etwas verwirrt. Wenn ich die Tabellen über Netbeans anlege, dann kann ich doch diesen "Foreignkey" direkt kennzeichnen in dem ich "index" auswähle oder?

Ich habe inzwischen herausgefunden, dass ich wohl bei PRAKTIKUMSTEILANHME die Spalten
Semester, Matrikel und Mkuerzel als Primärschlüssel kennzeichnen soll. So dass mein Primärschlüssel eine Kombination aus den dreien ist. Das habe ich nun gemacht. Dabei müsste doch MKUERZEL und MATRIKEL nun automatisch ein "ForeignKey" sein von den anderen Tabellen sein, weil "index" ja automatisch eingehakt ist.

Wofür brauch ich da speziell dann AlterTable? Oder brauch ich das gar nicht mehr? Weil ich komme ja über diese Schlüssel-Beziehungen auf die anderen Tabellen, sonst würden meine DB Abfragen ja nicht funktionieren wenn ich da das kreuzprodukt bilde, tun sie aber. Ich glaube ja, das Netbeans das automatisch macht. Oder?

Muss es Derby/JavaDB sein, oder hast du es nur ausgewählt, damit irgendetwas ausgewählt ist?

Die DB war in den uns zur Verfügung gestellt Files wo u.a auch noch Libs drin waren, die wir einbinden sollen.
 
Zuletzt bearbeitet:

Joose

Top Contributor
Wofür brauch ich da speziell dann AlterTable? Oder brauch ich das gar nicht mehr?

Es gibt oft Fälle wo man nachträglich eine Spalte zu einer Tabelle hinzufügen will.
Damit man aber nicht erst die Tabellen entladen, löschen, neu erstellen und neu befüllen muss kann man mit dem "ALTER" Befehl direkt die neue Spalte anlegen.
 

fehlerfinder

Bekanntes Mitglied
Ich bin immer noch etwas verwirrt. Wenn ich die Tabellen über Netbeans anlege, dann kann ich doch diesen "Foreignkey" direkt kennzeichnen in dem ich "index" auswähle oder?

"Index" != "Foreign Key" !!!

Ein Index ist zunächst einmal "nur" eine Möglichkeit, schneller auf Daten zuzugreifen (das ist etwas vereinfacht ausgedrückt, aber mag hier reichen).

Dann gibt es die spezielle Form eines "Unique Index": hier wird zusätzlich noch - quasi als Zusatzbedingung - gefordert, dass alle Werte der entsprechenden Spalte (zur Verwendung mehrerer Spalten gleich mehr, hier ist also erst einmal nur eine Spalte gemeint) "einzigartig" sind, jeder Wert darf nur einmal vorkommen.

Wenn du nun einen Primärschlüssel (oder primary key) verwenden willst, ist dazu ein "Unique Index" Voraussetzung (es mag davon Abweichungen geben, aber in der Praxis kenne ich nur primary keys die auf einem "Unique Index" basieren).

Der Primärschlüssel ist für sich gesehen erst einmal relativ nutzlos - WENN du nur eine Tabelle hast oder aber NUR Tabellen, die nicht miteinander in Beziehung stehen. Der zugrunde liegende "Unique Index" hingegen ist auch für eine einzelne Tabelle sinnvoll.

Ein Sekundärschlüssel (besser bekannt als "Foreign Key" oder auch "Fremdschlüssel") stellt eine logische Verknüpfung zwischen zwei Tabellen her. Es handelt sich dabei um einen Verweis von einer Tabelle auf eine andere, wobei das Ziel deines Fremdschlüssels immer ein Primärschlüssel einer anderen Tabelle sein muss.

Konkret auf dein Beispiel bezogen:

Der PK (primary key) für die Spalte MATRIKEL der Tabelle STUDENT wird aus der Tabelle PRAKTIKUMSTEILNAHME referenziert, und zwar über die dort ebenfalls definierte Spalte MATRIKEL. Wenn du eine solche "Foreign-Key-Beziehung" (also der Verweis einer als FK (Foreign Key) deklarierten Spalte einer Tabelle auf eine als PK deklarierten Spalte einer anderen Tabelle) über den entsprechenden Datenbank-Befehl definierst, sorgt das im Ergebnis dafür, dass du in PRAKTIKUMSTEILNAHME keine MATRIKEL angeben kannst, die nicht in STUDENT schon vorhanden ist. Und zwar ist das nichts, was dein Programm tut oder "entscheidet", sondern es handelt sich dabei um eine Datenbank-Funktionalität, die sich z.B. in einer SQLException niederschlagen kann, wenn du wider besseren Wissens versuchst, doppelte Daten zu speichern.

Soweit klar?

Dann kommen wir nun noch zur Verwendung mehrerer Spalten in einem "Unique Index":

Ich habe inzwischen herausgefunden, dass ich wohl bei PRAKTIKUMSTEILANHME die Spalten
Semester, Matrikel und Mkuerzel als Primärschlüssel kennzeichnen soll. So dass mein Primärschlüssel eine Kombination aus den dreien ist.

Wie oben gesagt, basiert ein PK immer auf einem Unique Index. In PRAKTIKUMSTEILANHME ist MATRIKEL aber nicht "unique", denn dann könnte ein Student nur ein einziges Praktikum während seines gesamten Studiums erleben. Das will niemand ;-)

Auch die Kombination aus MATRIKEL und MKUERZEL oder alternativ die Kombination aus MATRIKEL und SEMESTER ist nicht eindeutig: im ersten Fall wäre keine Wiederholung eines Praktikums möglich, im zweiten Fall könnte jeder Student (und natürlich auch jede Studentin) pro Semester nur ein Praktikum machen. Auch das könnte zu Engpässen im Studienablauf führen...

Richtig eindeutig wird es also erst, wenn du die drei Spalten zusammenfasst:

EIN Student macht in EINEM Semester das Praktikum xyz sicherlich nur EINMAL mit.

SQL-technisch bekommst du das hin, indem du einen "Unique Index" über die genannten drei Spalten erzeugst. Der PK ist wiederum grundsätzlich nur notwendig, wenn du diesen "Dreier-Index" auch referenzieren möchtest, die "Einzigartigkeit" deiner Datensätze ist bereits über den Unique Index sichergestellt. Tatsächlich ist es aber in der Regel so, dass du einen PK anlegst und dabei automatisch der Unique Index mit angelegt wird.

Das habe ich nun gemacht. Dabei müsste doch MKUERZEL und MATRIKEL nun automatisch ein "ForeignKey" sein von den anderen Tabellen sein, weil "index" ja automatisch eingehakt ist.

Ich denke, dass dies "automatisch" nicht der Fall ist, dürfte nach meinen Ausführungen oben klar geworden sein. Wenn nicht, hak nochmal nach.

Wofür brauch ich da speziell dann AlterTable? Oder brauch ich das gar nicht mehr? Weil ich komme ja über diese Schlüssel-Beziehungen auf die anderen Tabellen, sonst würden meine DB Abfragen ja nicht funktionieren wenn ich da das kreuzprodukt bilde, tun sie aber. Ich glaube ja, das Netbeans das automatisch macht. Oder?

Um eine Abfrage auf zwei Tabellen auszuführen oder gar ein Kreuzprodukt zu bilden, ist weder Index, noch Unique Index, weder Primary Key noch Foreign Key notwendig(!). Dafür sorgt einzig und allein die korrekte Formulierung deines SQL-Befehls. Allerdings kann je nach Umfang deiner Daten eine SQL-Abfrage über zwei Tabellen ohne Index (egal ob unique oder nicht unique) noch dazu ohne weitere Bedingungen, so dass du also ein "wunderschönes"(???) Kreuzprodukt erstelltst, SEHR lange dauern. Wohingegen dieselbe Abfrage unter Verwendung von Indexen und sinnvollerweise einschränkenden Bedingungen DEUTLICH schneller vonstatten geht. Das kann bei einigen Millionen Datensätzen durchaus schonmal ein Unterschied der Art "einige Stunden" (ohne Index, ohne Bedingung) zu "einige Sekunden" (mit Index, mit Bedingung) sein!
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Große Datensätze, kleine Rechte Datenbankprogrammierung 8
M Ein kleine Anwendung mit Java Schreiben Datenbankprogrammierung 2
T Kleine Tabellen für schnellere abfragen? Datenbankprogrammierung 3
C kleine verwirrung wegen auto_increment und applikation Datenbankprogrammierung 6
N Kleine Frage zu Connection Pooling mit DataSource Datenbankprogrammierung 2
D Ich möchte dass ich nachdem man den Kommentar geschrieben hat den Kommentar in den Tabelle Bestellübersicht geschbeichert wird klappt nicht bei mir Datenbankprogrammierung 2
D Tabelle an Persistenzeinheit binden Datenbankprogrammierung 1
T Datenbank: Tabelle erstellen bei Web-Applikation Datenbankprogrammierung 4
S gesamte Tabelle löschen Datenbankprogrammierung 2
Zrebna Wie mittels Hibernate eine Join-Tabelle als eigene Java-Klasse erstellen? Datenbankprogrammierung 5
N Oracle SQL - Nächst kleineren Namen2 zu einem Namen aus einer Tabelle Datenbankprogrammierung 3
Kirby.exe Eine Tabelle updaten Datenbankprogrammierung 16
L SQL Tabelle Datenbankprogrammierung 11
L SQL Datenbank Tabelle insert Datenbankprogrammierung 7
L SQL Datenbank Tabelle erstellen Datenbankprogrammierung 6
B Wie kopieren ich eine Spalte von einer Tabelle in eine andere Tabelle SQLite durch java code? Datenbankprogrammierung 26
J Oracle Datenbank-Tabelle per Combobox (oder ähnliches) auswählen Datenbankprogrammierung 3
P Derby/JavaDB Datenbanktabelle erweitern, ohne Tabelle zu ändern Datenbankprogrammierung 6
B Datenmodell für Regeln + Bedingungen & Referenz auf andere Tabelle Datenbankprogrammierung 12
S FilterSearch Tabelle Datenbankprogrammierung 4
J Aufbau meiner Datenbank/Tabelle - Verbessern? So lassen? Datenbankprogrammierung 39
Dimax MySQL 10 höchsten Werte aus einer Tabelle ermitteln Datenbankprogrammierung 30
L Java- Zähle alle Werte aus der Tabelle von aktiver Zelle Datenbankprogrammierung 12
B Tabelle für "wiederkehrende Rechnungen" Datenbankprogrammierung 12
P JSP - Daten aus 2 Tabellen in eine neue Tabelle einfügen Datenbankprogrammierung 1
Thallius MySQL Tabelle splitten aber wie eine abfragen? Datenbankprogrammierung 10
D MySQL Suche nach Max Value in einer Tabelle Datenbankprogrammierung 7
RowdyN SQLite Einfache Abfrage mit temporäre Tabelle, die nur innerhalb der Abfrage gültig ist Datenbankprogrammierung 0
N Dynamische Tabelle Datenbankprogrammierung 84
T Zeitraum aus SQL-Tabelle Datenbankprogrammierung 3
V SQLite 2 Tabelle vergleichen und alle unterschiede rausgeben Datenbankprogrammierung 1
D UCanAccess / MS Access - Tabelle / Spalte vorhanden Datenbankprogrammierung 3
M MySQL wie Listen oder arras in Tabelle(n) schreiben Datenbankprogrammierung 10
Paul15 Tabelle vergleichen Datenbankprogrammierung 15
J Tabelle synchronisieren mit Datenbank Datenbankprogrammierung 7
E Wie kann man bestimmte Zeilen der Tabelle rot markieren? Datenbankprogrammierung 1
L Tabelle mit Inhalt füllen Datenbankprogrammierung 2
J Optimierung von Querys/ ausgegebene Tabelle mit in neue Anfrage einbinden Datenbankprogrammierung 2
C Tabelle erstellen mit Apache JDBC-Util Datenbankprogrammierung 1
A MySQL Tabelle ID abfragen und Spalte ausgeben Datenbankprogrammierung 4
S Update Tabelle aus Textfeld Datenbankprogrammierung 2
A MySQL Problem bei Tabelle ausgeben Datenbankprogrammierung 3
E Nur der letzte Datensatz wird in Tabelle geschrieben Datenbankprogrammierung 4
B Nur 99% der Datensätze werden in Tabelle geschrieben Datenbankprogrammierung 2
Joew0815 Datenmerge große Tabelle Datenbankprogrammierung 16
R MySQL Blob aus DB auslesen und einer Tabelle ausgeben Datenbankprogrammierung 7
P Neue Tabelle dazugekommen Datenbankprogrammierung 1
C H2 Syntax fehler beim erstellen einer Tabelle Datenbankprogrammierung 4
J Normalisierung - Aufspaltung der Tabelle Datenbankprogrammierung 4
V HSQLDB Insert in eine Tabelle mit Autoincrement Datenbankprogrammierung 2
S Wie muss meine SQL Tabelle aufgebaut sein, um unendliche Attribute zu vermeiden Datenbankprogrammierung 2
R HSQLDB Tabelle in JTable übertragen Datenbankprogrammierung 3
S MySQL Einfügen in Tabelle nur von Programm zulassen Datenbankprogrammierung 7
S Oracle Database 11g , eclipse , Tabelle erstellen Datenbankprogrammierung 2
L MySQL Uhrzeit-Format innerhalb einer Tabelle Datenbankprogrammierung 8
E Abfrage nach existierender SQL-Tabelle Datenbankprogrammierung 7
M Designfrage zu Rows die sich auf einen Datensatz derselben Tabelle beziehen Datenbankprogrammierung 7
N Temporäre tabelle MySQL Datenbankprogrammierung 2
X MySQL Hibernate: Massenupdate auf unbekannte Tabelle Datenbankprogrammierung 4
D DB Tabelle in JTable anzeigen - Probleme Datenbankprogrammierung 8
Rudolf MySQL MySQL Tabelle mit Fremdschlüsseln in JTable darstellen Datenbankprogrammierung 5
Kenan89 Oracle Daten einer Tabelle in Array speichern Oracle Datenbankprogrammierung 10
L SQLite Daten werden nicht in die Tabelle eingefügt Datenbankprogrammierung 7
D JPA (Hibernate) : Tabelle zweimal joinen Datenbankprogrammierung 4
G Oracle Hibernate M:N-Beziehung mit nur einer vorhandenen Tabelle Datenbankprogrammierung 5
N [XLS]Strings in Excel-Tabelle schreiben (poi) Datenbankprogrammierung 2
M DB View in Tabelle konvertieren in DB2? Datenbankprogrammierung 2
N Einzelne Spalte in MySQL-DB-Tabelle schreiben Datenbankprogrammierung 7
D Probleme bei der Erzeugung einer Tabelle Datenbankprogrammierung 15
I Derby/JavaDB Problem mit Befüllung von Tabelle Datenbankprogrammierung 7
H MySQL Tabelle "Table" programmieren Datenbankprogrammierung 2
S Problem beim Anlegen einer Tabelle Datenbankprogrammierung 5
I Tabelle mit "|" getrennten Werten -> einzelnen Wert davon abfragen Datenbankprogrammierung 15
L Derby/JavaDB Fehler beim Erstellen einer Tabelle Datenbankprogrammierung 2
A Wie Tabelle auf bestimmten Inhalt überprüfen? Datenbankprogrammierung 7
G SQLite Abfrage, ob in Tabelle X Spalte Y existiert Datenbankprogrammierung 4
Y Tabelle (elegant) importieren Datenbankprogrammierung 4
turmaline [Hibernate] @OneToMany - Eine referenzierte Tabelle abfragen Datenbankprogrammierung 11
T Update an SQL Tabelle ?! Datenbankprogrammierung 10
F Baumstruktur erstellen und Art Tabelle festhalten!? Datenbankprogrammierung 13
S JPA: Objekt in Tabelle mit Composite Keys mappen (Embeddable Annotation) Datenbankprogrammierung 2
A Tabelle aktuell halten Datenbankprogrammierung 5
trash SQL, ganze Tabelle abfragen Datenbankprogrammierung 3
F HSQLDB HSQLDB lässt mich nicht auf erstellte Tabelle zugreifen Datenbankprogrammierung 12
Airwolf89 Spaltennamen einer Tabelle zurückgeben lassen Datenbankprogrammierung 9
J Ausgewählte Datensätze in DB-Tabelle schreiben Datenbankprogrammierung 13
J zufällige Auswahl aus einer Tabelle Datenbankprogrammierung 4
O eine Tabelle hat mehrere PrimKey mit dem selben Wert Datenbankprogrammierung 9
M Ausgabe in Tabelle der MySQL-Datenbank mit Java Datenbankprogrammierung 4
J Tabelle auslesen- knifflig Datenbankprogrammierung 7
Z [ORACLE] Ausgabe Tabelle im GUI Datenbankprogrammierung 4
S Daten einer Tabelle vergleichen und ggs neuen Wert einfügen Datenbankprogrammierung 8
R Tabelle Updaten aber auch Speichern Datenbankprogrammierung 2
D MySql Tabelle mit MySQLAdministrator (Anfänger) Datenbankprogrammierung 5
M Spaltennamen einer MS Access Tabelle ermitteln Datenbankprogrammierung 3
B Suche Query um genau einen Wert einer def. Gruppe aus einer Tabelle zu erhalten. Datenbankprogrammierung 2
C Prüfen, ob eine MySQL-Tabelle bereits existiert Datenbankprogrammierung 7
M Tabelle in Access Datei mit JDBC generieren Datenbankprogrammierung 3
G Tabelle für Zeitraum sperren Datenbankprogrammierung 4
G DB Modellierung mit variablen Attributen in der Tabelle Datenbankprogrammierung 4

Ähnliche Java Themen

Neue Themen


Oben