existenzabhängige/sdchwache Entität

Guten Tag liebes Forum

Ich bin neu hier und habe direkt eine Frage die mich brennend interessiert

Ich möchte über JAVA ein Script zur Erstellung der Datenbank einlesen . Das ganze funktioniert auch soweit ganz gut bis ich zur ersten Tabelle komme in der Sich mein Primary Key aus einem Attribut der selbigen Tabelle und einem Fremdschlüssel einer anderen Tabelle zusammensetzt.Die Aufgabenstellung meines Ausbilders lautet das wir alle Tabellen beim ersten Verbinden mit der Datenbank über das Skript anlegen sollen. Mein Problem ist das aber in der Tabelle aus der Ich den Fremdschlüssel ziehe am Anfang leer ist.

Mein Ansatz würde so aussehen das ich die abhängige Tabelle erst erstelle wenn in der übergeordneten Tabelle ein Datensatz vorhanden ist

Mein Derzeitiges Skript sieht folgender Maßen aus:

Das Problem tritt bei der Relation t_hälfte auf.Wenn ein Eintrag in t_spiel vorhanden ist gibt es keine Probleme



CREATE TABLE t_Spieler(
Kennung VARCHAR(30),
Passwort VARCHAR (15)NOT NULL ,
IP VARCHAR(15) ,
Profilbild BYTEA,
Aktiv BOOLEAN,
Abbrüche INT,
Strafpunkte INT,
Startwurf INT,
Statistik BYTEA,
CONSTRAINT PK_t_spieler PRIMARY KEY (Kennung)
);

CREATE TABLE t_Spielleiter(
fk_t_Spieler_Kennung VARCHAR(30),
Geleitete_Spiele INT DEFAULT 1,
CONSTRAINT PK_t_Spielerleiter_Kennung Primary KEY(fk_t_Spieler_Kennung),
CONSTRAINT FK_t_Spielerleiter_Kennung FOREIGN KEY (fk_t_Spieler_Kennung) REFERENCES t_Spieler(Kennung)ON UPDATE CASCADE ON DELETE CASCADE
);

CREATE TABLE t_ist_client(
fk_t_Spieler_Kennung VARCHAR(30),
fk_t_Spiel_Spiel_ID INT,
CONSTRAINT PK_t_ist_client PRIMARY KEY (fk_t_Spiel_Spiel_ID,fk_t_Spieler_Kennung),
CONSTRAINT FK_t_ist_client FOREIGN KEY (fk_t_Spieler_Kennung) REFERENCES t_Spieler(Kennung) ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT FK_t_ist_client FOREIGN KEY (fk_t_Spiel_Spiel_ID) REFERENCES t_Spiel(Spiel_ID) ON UPDATE CASCADE ON DELETE CASCADE
);

CREATE TABLE t_Spiel(
Spiel_ID SERIAL,
fk_t_Spielleiter_Kennung VARCHAR(30),
Status INT NOT NULL DEFAULT 1,
Zeit TIMESTAMP NOT NULL DEFAULT current_timestamp,
CONSTRAINT PK_t_Spiel PRIMARY KEY (Spiel_ID),
CONSTRAINT FK_t_Spiel FOREIGN KEY (fk_t_Spielleiter_Kennung) REFERENCES t_Spielleiter(fk_t_Spieler_Kennung)

);

CREATE TABLE t_Hälfte(
Art INT,
fk_t_Spiel_Spiel_ID INT,
Verlierer VARCHAR(30),
Stock INT DEFAULT 13,
CONSTRAINT PK_t_Hälfte PRIMARY KEY(Art,fk_t_Spiel_Spiel_ID) ,
CONSTRAINT FK_t_Spiel_Spiel_ID FOREIGN KEY (fk_t_Spiel_Spiel_ID)REFERENCES t_Spiel(Spiel_ID) ON UPDATE CASCADE ON DELETE CASCADE
);

CREATE TABLE t_Runde(
RundenNr Int ,
fk_t_Spiel_Spiel_ID INT,
fk_t_Hälfte_Art INT,
Beginner VARCHAR(30),
Verlierer VARCHAR(30),
Gewinner VARCHAR(30),

CONSTRAINT PK_t_Runde PRIMARY KEY (RundenNr),
CONSTRAINT FK_t_Spiel_Spiel_ID FOREIGN KEY (fk_t_Spiel_Spiel_ID)REFERENCES t_Spiel(Spiel_ID) ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT FK_t_Hälfte_Art FOREIGN KEY (fk_t_Hälfte_Art)REFERENCES t_Hälfte(Art) ON UPDATE CASCADE ON DELETE CASCADE
);

CREATE TABLE t_Durchgang(
fk_t_Spieler_Kennung VARCHAR(30),
fk_t_Spiel_Spiel_ID INT,
fk_t_Hälfte_Art INT,
fk_t_Runde_RundenNr INT,
Würfel_1 INT,
Würfel_2 INT,
Würfel_3 INT,
Zähler INT,

CONSTRAINT PK_t_Durchgang PRIMARY KEY (fk_t_Spieler_Kennung,fk_t_Spiel_Spiel_ID,fk_t_Hälfte_Art,fk_t_Runde_RundenNr)
) ;


Danke für helfende Kommentare

so arbeiten nun mal foreign keys - wo ist das Problem? Du mußt die Daten halt in der passenden Reihenfolge eingeben, oder aber die Constraints deferrable machen und so setzen. Dann kannst Du innerhalb einer TX auch das mit den Constraints aushebeln.

Btw.: für IP-Adressen gibt es passende Datentypen. Für die PK’s wäre es u.U. besser, numerische ID’s zu verwenden, das spart Platz und ist schneller. Umlaufe in Tabellenname / Spaltenname ist übrigens ganz, ganz schlecht.

Danke erstmal ich probiere das sofort mal aus

Muss ich denn alle Schlüssel auf Deferable setzen

Unbenannt.GIF
Also das ist mal mein Entwurf für die Relationen

Lies die Antwort von mir noch einmal :wink:

Ich bekomme es nicht hin leider haben wir im Unterricht das mit Deferable nicht behandelt
Da muss ich meinen Ausbilder morgen erstmal auf die Füße treten

Kannst Du mir vielleicht wenn es nicht zuviel verlangt ist nicht mal eben posten wie du mein Skript ändern würdest am beispiel von den Relationen t_hälfte und t_runde

Du hast:

test=# create table m(id int primary key);
CREATE TABLE
test=*# create table s(m_id int references m deferrable);
CREATE TABLE
test=*# commit;
COMMIT

Nun beginnen wir eine TX und setzen in dieser die Constraints auf deferred:

test=# begin;
BEGIN
test=*# set constraints all deferred;
SET CONSTRAINTS
test=*# 
test=*# 
test=*# insert into s values (2);
INSERT 0 1
test=*# commit;
ERROR:  insert or update on table "s" violates foreign key constraint "s_m_id_fkey"
DETAIL:  Key (m_id)=(2) is not present in table "m".

Ich kann das also einfügen, aber beim Commit knallt es, weil es ja in der Master-Tabelle fehlt.

Ok, next try:

test=# begin;
BEGIN
test=*# insert into s values (2);
ERROR:  insert or update on table "s" violates foreign key constraint "s_m_id_fkey"
DETAIL:  Key (m_id)=(2) is not present in table "m".

Noch schlimmer, es knallt schon bei der Eingabe. Klar, war nicht auf deferred gesetzt.

Next try:

test=# begin;
BEGIN
test=*# set constraints all deferred;
SET CONSTRAINTS
test=*# insert into s values (2);
INSERT 0 1
test=*# insert into m values (2);
INSERT 0 1
test=*# commit;
COMMIT
test=#

Yeah!

Zum nachlesen: https://www.postgresql.org/docs/9.1/static/sql-set-constraints.html


Btw: Sag Deinem Lehrer einen netten Gruß. Ich finde es Klasse, daß er Euch mit PG arbeiten läßt. Ich sehe SO OFT Studenten mit MySQL, daß einem vor der Zukunft Angst und Bange werden kann…