Create, insert, delete, update (und Datenintegrität)
Datentypen
Datentypen / Attribut-Domäne
Zahlen
numeric(p, s)
,
integer
,
int
Zeichenketten
character(n)
/
char(n)
,
character varying(n)
,
varchar(n)
Datums-Typ
date
Große datenmengen
blob
,
raw
,
clob
xml (xml Dokumente)
Manipulate Tables
Create
create table ProfessorIn (
PersNr integer primary key ,
Name varchar (10) not null ,
Rang character (2)
);
Update
alter table ProfessorIn rename to Vortragende;
alter table ProfessorIn add Raum integer;
alter table ProfessorIn drop Raum;
alter table ProfessorIn alter Name type varchar (30);
Delete
drop table ProfessorIn;
Manipulate Tuples
Create
insert into ProfessorIn values (2136 , 'Curie', 'C4', 36);
insert into ProfessorIn value
(2125 , 'Sokrates', 'C4', 226),
(2126 , 'Russel', 'C4', 232);
insert into hören
select MatrNr, VorlNr
from StudentIn, Vorlesung
where Titel = 'Logik';
Update
update StudentIn
set Semester = Semester + 1;
update ProfessorIn
set Rang = 'C2'
where Rang = 'C3' and PersNr > 2500;
Delete
delete from ProfessorIn
values (2137 , 'Kant', 'C4', 7);
delete from ProfessorIn where PersNr = 2137;
Integritätsbedingungen
Dynamisch Constraints an DB Zustandsänderungen
Statisch Constraints an DB Zuständen selbst
Semantisch aus der modellierten Welt.
zB bekannte implizite Bedingungen:
IDs müssen eindeutig sein
Kardinalitäten aus ER Modell werden eingehalten (durch Relationenmodell)
Attribut-Domänen Datentypen und Wertebereiche
Inklusion bei Generalisierung Untertypen Entities müssen auch im Obertyp enthalten sein
In SQL
Bei Definition:
CREATE TABLE
Nachträglich hinzugefügt oder entfernt:
ALTER TABLE ADD/DROP
unique( att, att, ...)
Schlüssel-Kandidaten
not null
keine Null-Werte
default
Angabe von Default-Werten
check
statische Überprüfung (mit
constraint
benennen)
primary key( att, att, ...)
Primärschlüssel
foreign key( att, att, ...)
Fremdschlüssel
references( table name )
Tabelle auf die verwiesen wird
Beispiel
create table Student(
MatrNr integer primary key,
Name varchar(30) not null,
Semester integer default 1
check (Semester between 1 and 13) -- muss immer true sein
);
create table prüfen (
MatrNr integer,
VorlNr integer,
PersNr integer
Note numeric(2,1)
check(Note between 0.7 and 5.0),primary key(MatrNr, VorlNr),
constraint vorherhören -- damit Fehlermeldungen deutlicher sind
check(exists (select * from hören h where
where h.VorlNr = prüfen.VorlNr and h.MatrNr = prüfen.MatrNr
))
);
Bei referentieller Integrität:
on update / on delete { no action | cascade | set null | set default }
Kaskadierendes Löschen durch
on delete cascade
create table Professoren (...);
create table Vorlesungen (
...
gelesenVon integer[foreign key] references Professoren
on update cascade -- änderungen werden mitübertragen
on delete set null -- beim Löschen auf null setzen
);
Referentielle Integrität
Fremdschlüssel entweder auf existierende Tupel
in anderer Tabelle (≠ dangling reference)
oder
null
.
Einfügen mit zyklischen Abhängigkeiten
Problem: "What came first? The chicken or the egg?"
Fehlermeldungen:
create table chicken (
cID integer primary key,
eID integer references egg;
);-> ERROR: relation ''egg'' does not exist
create table egg (
eID integer primary key,
cID integer references chicken;
);-> ERROR: relation ''chicken'' does not exist
insert into chicken values (1,11);-> ERROR: insert or update on table ''chicken'' violates foreign key constraint ''chickenrefegg''
-> DETAIL: Key (eid)=(11) is not present in the table ''egg'';
Lösungen:
-
Definition vom foreign key in der ersten Tabelle, dass man anlegt:
Nachträglich anlegen mit
ALTER TABLE
Beispiel
create table chicken ( cID integer primary key, eID integer references egg; );create table egg ( eID integer primary key, cID integer references chicken; );alter table chicken add constraint chickenrefegg foreign key (eID) references egg;
-
Neue Tupel einfügen:
Mit
DEFERRED
TransaktionMan kann bestimmen ab welchem Zeitpunkt der Transaktion die constraints geprüft werden.
[DEFERRABLE | NOT DEFERRABLE] -- am Transaktionsende vs. sofort überprüfen [INITIALLY DEFERRED | INITIALLY IMMEDIATE]
Beispiel
create table chicken ( cID integer primary key, eID integer references egg; );create table egg ( eID integer primary key, cID integer references chicken; );alter table chicken add constraint chickenrefegg foreign key (eID) references egg initially deferred deferrable;begin; insert into chicken values(1, 11); insert into egg values(11, 1); commit;
-
Tabelle löschen:
Manuell entfernen mit
DROP CONSTRAINT
ALTER TABLE tablename DROP CONSTRAINT constraintname;
Automatisch entfernen mit
CASCADE
DROP TABLE tablename CASCADE;
Beispiel
ALTER TABLE chicken DROP CONSTRAINT chickenrefegg; DROP TABLE egg CASCADE;