42
Prof. Dr. Stephan Kleuker 131 Datenbanken 5. SQL: Erstellen von Tabellen Erzeugen und Löschen von Tabellen Umgang mit Bedingungen (Constraints) Einfügen und Löschen von Daten Änderungen von Tabellenstrukturen

5. SQL: Erstellen von Tabellenhome.edvsz.fh-osnabrueck.de/skleuker/WS17_DB/DB_WS17_Teil3.pdf · VNR INTEGER CHECK(VNR >= 1000), Vname VARCHAR(12) NOT NULL, Status VARCHAR(10) NOT

  • Upload
    others

  • View
    17

  • Download
    0

Embed Size (px)

Citation preview

Prof. Dr. Stephan Kleuker

131Datenbanken

5. SQL: Erstellen von Tabellen

• Erzeugen und Löschen von Tabellen

• Umgang mit Bedingungen (Constraints)

• Einfügen und Löschen von Daten

• Änderungen von Tabellenstrukturen

Prof. Dr. Stephan Kleuker

132Datenbanken

SQL

• Structured Query LanguageHistorie: Anfänge ca. 1974 als SEQUEL (IBM, System R)

SQL 86 und SQL 89: Schnittmenge existierender Implementierungen

SQL 92 (SQL 2): z.B.- expliziter Verbund- Integritätsbedingungen- referenzielle IntegritätSQL 99 (SQL 3): z.B. (Standard besteht aus 5 Teilen)- aktive Regeln- Stored Procedures- objektorientierte KonzepteSQL 2003 (SQL 4): z.B.- MERGE- Befehl- Datentyp boolean (optional)- SQL/XML Zusammenhänge

SQL 2006SQL 2008SQL 2011SQL 2016…

Prof. Dr. Stephan Kleuker

133Datenbanken

Anmerkungen zur Syntax

• SQL (Derby) unterscheidet bei Befehlen, Tabellennamen und Attributen keine Groß- und Kleinschreibung, es bezeichnen z.B. CITY, city, City, cItY die gleiche Tabelle

• Innerhalb von Strings (Texten) unterscheidet SQL Groß- und Kleinschreibung, z.B. NAME = 'Berlin' entspricht nicht

NAME = 'berlin'

• Strings stehen in einfachen Hochkommata (neben Ä auf der Tastatur)

• Kommentare werden in /* ... */ eingeschlossen, oder, wenn nur einzeilig, mit -- eingeleitet

• Wenn man statt Apache Derby eine andere DB nutzt, müssen die genannten Standards auf ihre Gültigkeit überprüft werden

• In Derby werden mehrere Befehle durch ein „ ; “ getrennt

Prof. Dr. Stephan Kleuker

134

Apache Derby

• 1996 Entwicklungsstart Cloudscape Inc (Oakland, USA)

• Von Anfang an in Java entwickelt

• Neben Standard-Variante auch Embedded Version

• 1999 Informix kauft Cloudscape

• 2001 IBM kauf DB-Anteil von Informix

• 2004 unter Open Source Lizenz gestellt ; von Apache Software Foundation als Projekt akzeptiert

• Entwicklung von IBM (und früher Sun) unterstützt

• Als Java DB mit anderer Lizenz Teil jedes JDK

• Embedded einfach für Web- und Standalone-Programme als DB nutzbar (einfach eine Jar-Datei hinzufügen)

Datenbanken

Prof. Dr. Stephan Kleuker

135Datenbanken

Tabellen nach SQL (ohne Randbedingungen)

1002Mai23000SeniorSchmidt1002

1001Olm11000JuniorMeier1001

BetreuerNameKNRGehaltStatusVnameVNR

KundeVerkaeufer

1002Mai23000SeniorSchmidt1002

1001Olm11000JuniorMeier1001

BetreuerNameKNRGehaltStatusVnameVNR

KundeVerkaeufer

CREATE TABLE Verkaeufer(

VNR INTEGER,

Vname VARCHAR(12),

Status VARCHAR(10),

Gehalt NUMERIC

);

CREATE TABLE Kunde(

KNR INTEGER,

Name VARCHAR(12),

Betreuer INTEGER

);

Prof. Dr. Stephan Kleuker

136Datenbanken

Einfacher Aufbau und Beispiel

CREATE TABLE <tabellenname>(

<attributsname> <datentyp>,

...

<attributsname> <datentyp>

)

CREATE TABLE City(

Name VARCHAR(35),

Country VARCHAR(4), --Länderkürzel

Province VARCHAR(32),

Population INTEGER,

Longitude DOUBLE,

Latitude DOUBLE

)

Prof. Dr. Stephan Kleuker

137

Typspielerei in Derby (1/4)

CREATE TABLE Typen1(

xinteger INTEGER, /* 4 Bytes */

xint INT, /* 4 Bytes */

xsmallint SMALLINT, /* 2 Bytes */

xbigint BIGINT, /* 8 Bytes */

xreal REAL, /* 4 Bytes */

xdouble DOUBLE, /* 8 Byte */

xdoubleprecision DOUBLE PRECISION /* 8 Bytes */

);

INSERT INTO Typen1 VALUES(1, 1, 1, 1, 1, 1, 1);

INSERT INTO Typen1 VALUES(2147483647, 1

, 32767, 9223372036854775807, 3.402E+38, 2.0, 2.0);

INSERT INTO Typen1 VALUES(1, 1, 32768, 1, 1, 1, 1);

INSERT INTO Typen1 VALUES(2147483648, 1, 1, 1, 1, 1, 1);

INSERT INTO Typen1 VALUES(1, 1, 1, 9223372036854775808, 1, 1, 1);

INSERT INTO Typen1 VALUES(1, 1, 1, 1, 3.403E+38, 1, 1);

Datenbanken

Prof. Dr. Stephan Kleuker

138

Typspielerei in Derby (2/4)CREATE TABLE Typen2(

xdecimal DECIMAL(3,2),

x1numeric NUMERIC,

x2numeric NUMERIC(3),

x3numeric NUMERIC(3,2)

);

INSERT INTO Typen2 VALUES(1, 1, 1, 1);

INSERT INTO Typen2 VALUES(1.11, 1.11, 1.111, 1.11);

INSERT INTO Typen2 VALUES(1, 1111, 111.99, 9.99);

INSERT INTO Typen2 VALUES(1, 1, 1111, 1);

INSERT INTO Typen2 VALUES(1, 1, 1, 11);

INSERT INTO Typen2 VALUES(0.1234, 1, 1, 1.111);

SELECT * FROM Typen2;

Datenbanken

Prof. Dr. Stephan Kleuker

139

Typspielerei in Derby (3/4)CREATE TABLE Typen3(

xchar CHAR,

xvarchar VARCHAR(4), -- max 32672

xclob CLOB, -- character large object

xdate DATE,

xtime TIME,

xtimestamp TIMESTAMP

);

-- beide ok

INSERT INTO Typen3 VALUES('', 'Hai', 'Ho'

,'2015-08-06', '00:00', '2015-08-30 23:03:20.123456');

INSERT INTO Typen3 VALUES(' ', 'Hai', 'Ho'

,'2015-09-30', '23:59:59', '2015-08-30 23:03:20');

Datenbanken

Prof. Dr. Stephan Kleuker

140

Typspielerei in Derby (4/4)INSERT INTO Typen3 VALUES('', 'Haino', ''

,'2015-08-06', '13:00', '2015-08-30 23:03:20.123456');

INSERT INTO Typen3 VALUES('', 'Hai', 'Ho'

,'2015-09-31', '23:59:59', '2015-08-30 23:03:20');

INSERT INTO Typen3 VALUES('N', 'Hai', ''

,'2015-09-30', '24:00:00', '2015-08-30 24:00:00');

INSERT INTO Typen3 VALUES('Nu', 'Hai', ''

,'2015-09-30', '24:00:00', '2015-08-30 24:00:00');

INSERT INTO Typen3 VALUES('N', 'Hai', ''

,'2015-09-30', '24:00:00', '2015-08-30 24:00:01');

INSERT INTO Typen3 VALUES('', 'Hai', 'Ho'

,'2015-09-30', '23:59:59', '2015-08-30 23:03');

SELECT * FROM Typen3;

Datenbanken

Prof. Dr. Stephan Kleuker

141Datenbanken

Überblick Bedingungen (Constraints)

Mit Tabellendefinitionen können Bedingungen für konkrete Attributwerte formuliert werden, die bei Eintragungen überprüft werden

- Wertebereichseinschränkungen

- Wert muss angegeben werden

- (Angabe eines Default-Wertes)

- Angaben von Schlüsseln und Fremdschlüsseln

- Forderungen an einzelne Tabelleneinträge (Datensätze) in Form von Prädikaten

Prof. Dr. Stephan Kleuker

142Datenbanken

Bedingungen (Constraints) (1/2)

• Syntax:[CONSTRAINT <name>] <bedingung>

• Typischer Aufbau einer <bedingung>:CHECK (<boolesche_bedingung>)

• Besondere <bedingung> mit anderen Formen:

– Primärschlüssel, Fremdschlüssel, eindeutige Attributwerte

– Spalten-Constraints zur Angabe ob Null-Werte erlaubt sind

• Name VARCHAR(10) NOT NULL

• äquivalent als Tabellen-ConstraintCHECK(Name IS NOT NULL)

Hinweis: Man kann es sich einfach machen und alle Constraints als Tabellen-Constraints aufschreiben

Prof. Dr. Stephan Kleuker

143Datenbanken

Beispiel

Randbedingungen:

• Verkaeufer-Nummer mindestens vier-stellig

• Name und Status immer angegeben

• ein „Junior“ verdient maximal 2500

CREATE TABLE Verkaeufer(

VNR INTEGER CHECK(VNR >= 1000),

Vname VARCHAR(12) NOT NULL,

Status VARCHAR(10) NOT NULL,

Gehalt NUMERIC,

PRIMARY KEY(VNR),

CONSTRAINT MaxJunior CHECK

(NOT(Status = 'Junior')

OR Gehalt <= 2500)

);

1002Mai23000SeniorSchmidt1002

1001Olm11000JuniorMeier1001

BetreuerNameKNRGehaltStatusVnameVNR

KundeVerkaeufer

1002Mai23000SeniorSchmidt1002

1001Olm11000JuniorMeier1001

BetreuerNameKNRGehaltStatusVnameVNR

KundeVerkaeufer

Prof. Dr. Stephan Kleuker

144Datenbanken

Syntax von Tabellen mit Constraints

CREATE TABLE <tabellenname>(

<attributsname> <datentyp> [DEFAULT <wert>]

[<spaltenconstraint>...

<spaltenconstraint>],

...

<attributsname> <datentyp> [DEFAULT <wert>]

[<spaltenconstraint>...

<spaltenconstraint>],

[<tabellenconstraint>]

...

[<tabellenconstraint>]

)

- Teile in eckigen Klammern können weggelassen werden

- <spaltenconstraint> bezieht sich nur auf einen Spaltenwert

- <tabellenconstraint> kann sich auf eine Zeile beziehen

Prof. Dr. Stephan Kleuker

145

Erinnerung: Boolesche Logik

Datenbanken

A B NOT(A) A AND B A OR B NOT(A) OR B

T T F T T T

T F F F T F

F T T F T T

F F T F F T

Prof. Dr. Stephan Kleuker

146Datenbanken

Auswertung von Constraints – Dreiwertige Logik• Wenn Änderungen an

Attributwerten durchgeführt oder neue Zeilen eingefügt werden, findet Überprüfung der Constraints statt

• Wird ein Constraint nach FALSE ausgewertet, wird die Änderung verworfen

• Achtung !! Datenbanken haben eine drei-wertige Logik (TRUE (T), FALSE (F), UNKNOWN (U)), findet z.B. eine Prüfung VNR>=1000statt und ist der Wert von VNR NULL, wird die Bedingung nach UNKNOWN ausgewertet

A B NOT

(A)

A

AND

B

A

OR

B

NOT(A)

OR B

T T F T T T

T F F F T F

T U F U T U

F T T F T T

F F T F F T

F U T F U T

U T U U T T

U F U F U U

U U U U U U

Prof. Dr. Stephan Kleuker

147Datenbanken

Bedingungen (Tabellen-Constraints) (2/2)

• Angabe von Primärschlüsseln (ausgewählter Schlüsselkandidat):PRIMARY KEY(<attributsname>[,...,<attributsname>])

• Fremdschlüssel:FOREIGN KEY (<attributsname>[,...,<attributsname>])

REFERENCES <tabellenname>

(<attributsname>[,...,<attributsname>])

[ON DELETE CASCADE]

– In den Attributslisten steht, wie die Attribute in der zu erstellenden und in der referenzierten Tabelle heißen (müssen dort PRIMARY KEY sein, Tabelle muss vorher existieren)

– REFRENCES-Bedingung wird durch NULL-Eintrag nicht verletzt

• Eindeutigkeit von Attributswerten (Attributskombinationen)UNIQUE ((<attributsname>[,...,<attributsname>])

Prof. Dr. Stephan Kleuker

148Datenbanken

Beispiel

Randbedingungen:

• KNR ist Schlüssel

• Kunde hat Name

• Betreuer ist Schlüssel in Verkäufer-Tabelle

CREATE TABLE Kunde(

KNR INTEGER,

Name VARCHAR(12)

CONSTRAINT Kname NOT NULL,

Betreuer INTEGER,

PRIMARY KEY(KNR),

CONSTRAINT FK_Kunde

FOREIGN KEY (Betreuer)

REFERENCES Verkaeufer(VNR)

);

1002Mai23000SeniorSchmidt1002

1001Olm11000JuniorMeier1001

BetreuerNameKNRGehaltStatusVnameVNR

KundeVerkaeufer

1002Mai23000SeniorSchmidt1002

1001Olm11000JuniorMeier1001

BetreuerNameKNRGehaltStatusVnameVNR

KundeVerkaeufer

Prof. Dr. Stephan Kleuker

149Datenbanken

Schlüsselkandidaten

• Primary Key ist Schlüsselkandidat, der aus der Menge der Schlüsselkandidaten durch Tabellenersteller ausgewählt wird

• Primary Keys sind eindeutig, dürfen keine NULL-Werte enthalten

• Das Beispiel erfüllt UNIQUE(Eins, Zwei), aber nicht UNIQUE(Eins)und nicht UNIQUE(Zwei)

• Mit UNIQUE kann man z. B. festhalten, dass es Alternativen zum Primary Key gibt

• Beispiel:CREATE TABLE Country(

Name VARCHAR(32) NOT NULL UNIQUE,

Code VARCHAR(4) PRIMARY KEY,

...)

• Nur wenn ein Attribut Primary Key, dann als Spalten-Constraintformulierbar

Eins Zwei

a b

a NULL

NULL b

NULL NULL

Prof. Dr. Stephan Kleuker

150Datenbanken

Beispiel

CREATE TABLE is_member(

Country VARCHAR(4) REFERENCES Country(Code),

Organization VARCHAR(12)

REFRENCES Organization(Abbreviation),

Type VARCHAR(30),

CONSTRAINT MemberKey

PRIMARY KEY(Country,Organization)

)

• Anmerkungen: Hier sind die FOREIGN KEY-Constraints direkt den Attributen zugeordnet worden, könnten auch getrennt aufgeführt werden

• Aus einer Design-Entscheidung für Mondial folgt, dass es Attribute gibt, die wie Tabellen heißen, die sie referenzieren (eher ungewöhnlich, aber machbar)

Prof. Dr. Stephan Kleuker

151Datenbanken

Einfügen von Daten (1/2)

• einfache Variante:

INSERT INTO <tabelle> VALUES (<werteliste>)

Die <werteliste> muss für jedes Attribut einen Wert enthalten, für undefinierte Werte wird NULL geschrieben

• mit ausgewählten Attributen:

INSERT INTO <tabelle>

(<attributsname>[,...,<attributsname>])

VALUES (<wert>[,...,<wert>])

Werte werden in die ausgewählten Spalten geschrieben, Rest mit NULL-Werten oder DEFAULT-Werten (s. später) gefüllt

Prof. Dr. Stephan Kleuker

152Datenbanken

Einfügen von Daten (2/2)

• Ergebnisse einer Anfrage:

INSERT INTO <tabelle>[(attributsliste)] <anfrage>

(wird später deutlich)

• Beispiel:

INSERT INTO Country (Name, Code, Population)

VALUES('Lummerland','LU',4)

Prof. Dr. Stephan Kleuker

153Datenbanken

Beispiel

CREATE TABLE Verkaeufer( ...);

CREATE TABLE Kunde(...);

INSERT INTO Verkaeufer VALUES (1001,'Meier','Junior',1000);

INSERT INTO Verkaeufer VALUES (1002,'Schmidt','Senior',3000);

INSERT INTO Kunde VALUES (1,'Olm',1001);

INSERT INTO Kunde VALUES (2,'Mai',1002);

1002Mai23000SeniorSchmidt1002

1001Olm11000JuniorMeier1001

BetreuerNameKNRGehaltStatusVnameVNR

KundeVerkaeufer

1002Mai23000SeniorSchmidt1002

1001Olm11000JuniorMeier1001

BetreuerNameKNRGehaltStatusVnameVNR

KundeVerkaeufer

Prof. Dr. Stephan Kleuker

154Datenbanken

Default-Werte

• Durch Default-Werte kann man darauf verzichten, einen Wert für ein Attribut anzugeben

• Beispiel:CREATE TABLE is_member(

Country VARCHAR(4),

Organization VARCHAR(12),

Type VARCHAR(30) DEFAULT 'member',

CONSTRAINT MemberKey PRIMARY KEY

(Country,Organization)

);

• folgende Einfügemöglichkeiten existieren:INSERT INTO is_member

VALUES ('CZ','EU','membership applicant');

INSERT INTO is_member (Country, Organization)

VALUES('D','EU');

Prof. Dr. Stephan Kleuker

155Datenbanken

Löschen von Daten

• Mit DELETE können eine oder mehrere Zeilen aus jeweils einer Tabelle entfernt werden

DELETE FROM <tabelle> WHERE <bedingung>

• Ob Zeile gelöscht werden darf, hängt davon ab, ob eine andere Zeile einer anderen Tabelle eine Referenz auf diese Zeile hat und welche Form die Referenz hat (siehe Beispiele)

• Jede Zeile, für die die <bedingung> nach TRUE ausgewertet wird, wird (wenn erlaubt) gelöscht

• Löschen aller Städte in Deutschland

DELETE FROM City WHERE Country='D';

• Wird <bedingung> weggelassen, wird sie als TRUE interpretiert -> alle Zeilen werden (wenn erlaubt) gelöscht

DELETE FROM City;

Prof. Dr. Stephan Kleuker

156Datenbanken

Einfügen ohne übergeordneten Schlüssel (1/2)

CREATE TABLE Kunde(

KNR INTEGER,

Name VARCHAR(12),

Betreuer INTEGER,

PRIMARY KEY(KNR),

CONSTRAINT FK_Kunde

FOREIGN KEY (Betreuer)

REFERENCES Verkaeufer(VNR)

);

INSERT INTO Kunde VALUES(3,'Hai',1003);

Error code 30000, SQL state

23503: INSERT in Tabelle

'KUNDE' hat für Schlüssel

(1003) den Fremdschlüssel-

Constraint 'FK_KUNDE'

verletzt. Die Anweisung wurde

zurückgesetzt.

1002Mai23000SeniorSchmidt1002

1001Olm11000JuniorMeier1001

BetreuerNameKNRGehaltStatusVnameVNR

KundeVerkaeufer

1002Mai23000SeniorSchmidt1002

1001Olm11000JuniorMeier1001

BetreuerNameKNRGehaltStatusVnameVNR

KundeVerkaeufer

Prof. Dr. Stephan Kleuker

157Datenbanken

Einfügen ohne übergeordneten Schlüssel (2/2)

CREATE TABLE Kunde(

KNR INTEGER,

Name VARCHAR(12),

Betreuer INTEGER,

PRIMARY KEY(KNR),

CONSTRAINT FK_Kunde

FOREIGN KEY (Betreuer)

REFERENCES Verkaeufer(VNR)

);

INSERT INTO Kunde(KNR,Name)

VALUES(3,'Hai');

SELECT * FROM Kunde;

KNR NAME BETREUER

--- ------ ----------

1 Olm 1001

2 Mai 1002

3 Hai

3 Zeilen ausgewählt.

1002Mai23000SeniorSchmidt1002

1001Olm11000JuniorMeier1001

BetreuerNameKNRGehaltStatusVnameVNR

KundeVerkaeufer

1002Mai23000SeniorSchmidt1002

1001Olm11000JuniorMeier1001

BetreuerNameKNRGehaltStatusVnameVNR

KundeVerkaeufer

Prof. Dr. Stephan Kleuker

158Datenbanken

Foreign Key ohne Delete Cascade

CREATE TABLE Kunde(

KNR INTEGER,

Name VARCHAR(12),

Betreuer INTEGER,

PRIMARY KEY(KNR),

CONSTRAINT FK_Kunde

FOREIGN KEY (Betreuer)

REFERENCES Verkaeufer(VNR)

);

SELECT * FROM Kunde;

DELETE FROM Verkaeufer

WHERE VNR=1001;

KNR NAME BETREUER

--- ------ ----------

1 Olm 1001

2 Mai 1002

Error code 30000, SQL state

23503: DELETE in Tabelle

'VERKAEUFER' hat für Schlüssel

(1001) den Fremdschlüssel-

Constraint 'FK_KUNDE'

verletzt. Die Anweisung wurde

zurückgesetzt.

1002Mai23000SeniorSchmidt1002

1001Olm11000JuniorMeier1001

BetreuerNameKNRGehaltStatusVnameVNR

KundeVerkaeufer

1002Mai23000SeniorSchmidt1002

1001Olm11000JuniorMeier1001

BetreuerNameKNRGehaltStatusVnameVNR

KundeVerkaeufer

Prof. Dr. Stephan Kleuker

159

CREATE TABLE Kunde(

KNR INTEGER,

Name VARCHAR(12),

Betreuer INTEGER,

PRIMARY KEY(KNR),

CONSTRAINT FK_Kunde

FOREIGN KEY (Betreuer)

REFERENCES Verkaeufer(VNR)

ON DELETE CASCADE

);

SELECT * FROM Kunde;

DELETE FROM Verkaeufer

WHERE VNR=1001;

SELECT * FROM Kunde;

Datenbanken

Foreign Key mit Delete Cascade (nicht in Derby!)

KNR NAME BETREUER

--- ------ ----------

1 Olm 1001

2 Mai 1002

2 Zeilen ausgewählt.

1 Zeile wurde gelöscht.

KNR NAME BETREUER

--- ------ ----------

2 Mai 1002

1 Zeile wurde ausgewählt.

1002Mai23000SeniorSchmidt1002

1001Olm11000JuniorMeier1001

BetreuerNameKNRGehaltStatusVnameVNR

KundeVerkaeufer

1002Mai23000SeniorSchmidt1002

1001Olm11000JuniorMeier1001

BetreuerNameKNRGehaltStatusVnameVNR

KundeVerkaeufer

Prof. Dr. Stephan Kleuker

160Datenbanken

Formatvorlage

• SQL bietet viele Alternativen, an denen Constraints stehen können => in Projekten Coding-Guideline benötigt

CREATE TABLE Kunde(

KNR NUMBER,

Name VARCHAR(12) NOT NULL,

Betreuer Number,

PRIMARY KEY(KNR),

CONSTRAINT FK_Kunde1

FOREIGN KEY (Betreuer)

REFERENCES Verkaeufer(VNR),

CONSTRAINT Kunde_GrosseKNR

CHECK(KNR>1000),

);

Attribute, nur elementare

Constraints und Default-

Werte

dann Primärschlüssel

dann Fremdschlüssel (am

Constraintnamen erkennbar)

dann weitere Constraints

Prof. Dr. Stephan Kleuker

161Datenbanken

Tabellen löschen

DROP TABLE <tabelle> [CASCADE CONSTRAINTS]

• Tabellen müssen nicht leer sein, wenn sie gelöscht werden sollen

• Eine Tabelle, auf die noch eine andere Tabelle mit REFERENCESzeigt, kann mit DROP TABLE <tabelle> nicht gelöscht werden

• Oracle, nicht Derby: Mit DROP TABLE <tabelle> CASCADE CONSTRAINTS wird eine Tabelle immer gelöscht, bei anderen Tabellen, die mit REFERENCES auf diese Tabelle zeigen, wird diese Integritätsbedingung (dieses Constraint) gelöscht

• Achtung, anders als bei Derby! SQL-Standard nur DROP TABLE <t> entspricht dann CASCADE CONSTRAINTS

Prof. Dr. Stephan Kleuker

162Datenbanken

Ändern von Tupeln

UPDATE <tabelle>

SET <attributsname> = <wert> | (<Unteranfrage>),

...

<attributsname> = <wert> | (<Unteranfrage>)

WHERE <Boolesche_Bedingung>

• Für jede Tabellenzeile, die die <Boolesche_Bedingung> erfüllt, werden die Werte der Attribute wie beschrieben geändert

UPDATE City

SET Name = 'Leningrad',

Population = Population + 1000

WHERE Name = 'Sankt-Petersburg'

Prof. Dr. Stephan Kleuker

163Datenbanken

Vorgehensweise bei Übungen• Will man Definitionen von Tabellen testen, empfiehlt es sich

ein SQL-Skript der folgenden Form für zu schreiben:DROP TABLE B;

DROP TABLE A;

CREATE TABLE A(

...);

CREATE TABLE B(

...);

INSERT INTO A VALUES(...); ...

INSERT INTO B VALUES(...); ...

SELECT * FROM A; // genauer nächste VL

SELECT * FROM B; // genauer nächste VL

• Dieses Skript wird in der DB ausgeführt. Ergebnisse werden von der DB ausgegeben

• Achtung: Scheitert ein SQL-Befehl wird der Fehler ausgegeben und trotzdem der nächste Befehl ausgeführt (deshalb läuft unser Skript)

• Speichern Sie ihre Skripten in *.sql-Dateien

Prof. Dr. Stephan Kleuker

164Datenbanken

Ihr Arbeitsbereich

• in NetBeans eigener DB-Server; hier können Datenbanken angelegt werden

• Datenbanken immer mit Nutzer und Passwort anlegen!

• Angelegte Tabellen und eingetragene Werte bleiben nach dem Verlassen der Datenbank erhalten, es ist kein vorheriges Abspeichern notwendig

• Für Experten: Bei der Anmeldung wird bereits eine konkrete Datenbank ausgewählt, ein USES DBx ist nicht notwendig

• genutzte Datenbank steht in NetBeans in der Kopfzeile

• Infos: http://home.edvsz.hs-

osnabrueck.de/skleuker/querschnittlich/NetbeansNutzung.pdf

Prof. Dr. Stephan Kleuker

165Datenbanken

Oberfläche des Worksheets in NetBeans

Detailbeschreibung auf Web-Seite

Prof. Dr. Stephan Kleuker

166Datenbanken

Syntax von Tabellenänderungen

ALTER TABLE <tabelle>

ADD (<add-zeilen>)

DROP PRIMARY KEY

| UNIQUE (<spaltenliste>)

| CONSTRAINT <constraintname>

• Im Standard auch DISABLE und ENABLE (z. B. Oracle) enthalten

Prof. Dr. Stephan Kleuker

167Datenbanken

Beispiel für Tabellenänderungen

ALTER TABLE Z ADD COLUMN Y INTEGER;

ALTER TABLE Z ADD CHECK(Y <100);

ALTER TABLE Z ADD CONSTRAINT Nr2 CHECK(Y > 0);

ALTER TABLE Z DROP CONSTRAINT nr2;

ALTER TABLE Z ALTER COLUMN Y NULL; --loescht Constraints

ALTER TABLE Z DROP COLUMN Y;

• neue Spalten werden mit NULL-Werten gefüllt, damit NOT NULL sinnlos

• später mit ALTER TABLE ADD CONSTRAINT ... änderbar

Prof. Dr. Stephan Kleuker

168Datenbanken

Anmerkungen zu Änderungen

• PRIMARY KEY-Bedingung kann nicht gelöscht/disabledwerden, solange dieser Schlüssel durch einen Fremdschlüssel in einer REFERENCES-Deklaration referenziert wird

• Bei verketteten Bedingungen ist DISABLEn und späteres ENABLEn sehr aufwändig (ORACLE unterstützt beim DISABLEn den Zusatz CASCADE)

• Oft werden vor dem Update die entsprechenden Integritätsbedingungen deaktiviert und nachher wieder aktiviert

Prof. Dr. Stephan Kleuker

169Datenbanken

Beispiel: Ändern mit Entfernen und Hinzufügen

„Meier hat neue VNR 4444“ALTER TABLE Kunde

DROP CONSTRAINT FK_Kunde;

UPDATE Verkaeufer

SET VNR=4444

WHERE VNR=1001;

UPDATE Kunde

SET Betreuer=4444

WHERE Betreuer=1001;

ALTER TABLE Kunde

ADD CONSTRAINT FK_Kunde

FOREIGN KEY (Betreuer)

REFERENCES Verkaeufer(VNR);

1002Mai23000SeniorSchmidt1002

1001Olm11000JuniorMeier1001

BetreuerNameKNRGehaltStatusVnameVNR

KundeVerkaeufer

1002Mai23000SeniorSchmidt1002

1001Olm11000JuniorMeier1001

BetreuerNameKNRGehaltStatusVnameVNR

KundeVerkaeufer

CREATE TABLE Kunde(

KNR NUMBER,

Name VARCHAR(12),

Betreuer NUMBER,

PRIMARY KEY(KNR),

CONSTRAINT FK_Kunde

FOREIGN KEY (Betreuer)

REFERENCES Verkaeufer(VNR)

);

Prof. Dr. Stephan Kleuker

170Datenbanken

Mondial

• Übungsbeispiel zusammengestellt von der Uni Freiburg („wohnt“ jetzt in Göttingen, Prof. May, [Mon] http://www.dbis.informatik.uni-goettingen.de/Mondial/)

• Zusammenstellung verschiedener geographischer Daten (keine Garantie der Richtigkeit, etwas veraltet)

• Simuliert echte DB mit unvollständigen Daten

• Steht lokal angepasst an Derby auf der Veranstaltungsseite zur Verfügung (Datenbankschema und Inhalt)

• Soll jeder zum Ausprobieren in seine „lokale“ DB-Version einspielen.

• SQL-Aufrufe über das Web auf eine Oracle Datenbank: http://www.semwebtech.org/sqlfrontend/

Prof. Dr. Stephan Kleuker

171Datenbanken

Ausschnitt ER-Mondial [Mon]

Prof. Dr. Stephan Kleuker

172

In Praktika wird Tabellenübersicht genutzt

Datenbanken