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:

  1. 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;
    

  1. Neue Tupel einfügen:

    Mit DEFERRED Transaktion

    Man 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;

  1. 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;