SQL und Daten in zwei Tabellen ändern

Gast #2517084
Lesenswert?

Hi,

und zwar stelle ich mir gerade folgende Frage.

Sagen wir ich habe eine Relation person mit Personalnummer, Name und 
Nachname
und dazu eine Relation Arbeitet bei mit Personalnummer und Abteilung.

Jetz möchte ich gerne, wenn ich die Personalnummer in der Relation 
person ändere, dass sich das auch automatisch in der Arbeitet Relation 
ändert.

Ich weiß zwar wie ich die z.b. über einen Schlüssel in Relation bringen 
kann, aber nicht wie ich die Änderung in beiden vollziehe.

Es geht hier um Oracle SQL.

Danke
Gast #2517107
Lesenswert?

Also diese relation ist käse
was machst du wenn zwei arbeitgeber das gleiche nummernsystem verwenden 
und plötzlich zwei personen die gleiche personalnummer haben

ich würds so machen

Tablle Personen
SID Name Vorname

Tablle Arbeitet für
SID Personen_UID Personalnummer Unternehmen_UID

Tabelle Arbeitgeber
SID Unternehmen


So kannst du Tabellen für mehrere Sachen verwenden und bist nicht zu 
spezifisch und flexibel was du noch in Arbeitet für informationen 
hinzufügst

so können auch personen für mehrer unternemen arbeiten und verschiedene 
personalnummern haben
#2517119
Lesenswert?

mikeii schrieb:
> Nene es geht hier nicht um ein echtes System, sonder um ein beispiel wie
> das gehen sollte.

Also um Hausaufgaben. Niemand nimmt $$$$$$ in die Hand, nur um mal mit 
Oracle spielen zu können, wenn es fast jede andere SQL-Datenbank genauso 
tun würde.

Zum Thema: "on update cascade" ist genau das, was du brauchst. Wenn du 
eine Fehlermeldung kriegst, hast du dich vermutlich vertippt.
Aber um das genau zu sagen, müssen wir exakt wissen, was du eingetippt 
hast, und was die Datenbank darauf geantwortet hat.
Gast #2517123
Lesenswert?

Ja Hausaufgaben ist gut gesagt, eher Vorbereitung auf die Prüfungen

CREATE TABLE DJ(DJName Varchar(10),Stundenlohn Number,CONSTRAINT DJ_pk 
PRIMARY KEY (DJName));

CREATE TABLE arbeitet(DJName Varchar(10),Name Varchar(10),Adresse 
Varchar(10),Stunden Number);

ALTER TABLE arbeitet ADD CONSTRAINT arbeitet_fk FOREIGN KEY (DJName) 
REFERENCES DJ(DJName) ON UPDATE CASCADE;


hab gerade gelesen, dass es ON UPDATE CASCADE gar nicht bei Oracle gibt, 
aber das steht sogar so in unserem Script drin, welches sich auf Oracle 
bezieht ...
Gast #2517133
Lesenswert?

hab jetz mit oracle nicht so viel gemacht aber evtl hilft dir das

http://www.java2s.com/Code/SQLServer/Constraints/DELETECASCADEandUPDATECASCADE.htm

dazu musst du anscheinend keys definieren

11> CREATE TABLE works_on1
12>             (emp_no INTEGER NOT NULL,
13>              project_no CHAR(4) NOT NULL,
14>              job CHAR (15) NULL,
15>              enter_date DATETIME NULL,
16>              CONSTRAINT prim_works1 PRIMARY KEY(emp_no, project_no),
17>              CONSTRAINT foreign1_works1 FOREIGN KEY(emp_no) 
REFERENCES employee(emp_no) ON DELETE CASCADE,
18>              CONSTRAINT foreign2_works1 FOREIGN KEY(project_no) 
REFERENCES project(project_no) ON UPDATE CASCADE)
#2517147
Lesenswert?

mikeii schrieb:
> hab gerade gelesen, dass es ON UPDATE CASCADE gar nicht bei Oracle gibt,
> aber das steht sogar so in unserem Script drin, welches sich auf Oracle
> bezieht ...

Naja, es ist halt mehr oder weniger Standard-SQL.

Oracle ist eher der Meinung, dass sich Primärschlüssel in Tabellen nicht 
ändern sollten, deshalb gibt's das da nicht.

Lösungsweg 1 (unschön): Trigger "onUpdate" auf die DJ-Tabelle, manuell 
das "on update cascade" nachrüsten.

Lösungsweg 2: andere Datenbank verwenden.

Lösungsweg 3: der DJ-Tabelle einen neuen Primärschlüssel verpassen (int 
würde ich nehmen, mit sequence zum incrementieren)
Diesen verknüpfen.
Beim Auslesen der "arbeitet"-Tabelle per Subselect oder Join den DJName 
mit rausholen. evtl. gleich eine View hierfür anlegen.
Gast #2517498
Lesenswert?

Das ganze ändern in zwei Tabellen würde ich inkl Kontrolllesen nach 
Update in eine Transaction packen.

Begin transaction
update table1
update table2
lese table1 und schau nach ob es passt
lese table2 ob es passt
passen beide? Schliess die trannsaction sauber ab
passt es nicht: rollback transaction
End transaction

so funktioniert das unter jeder transaction fähigen DB, nicht nur unter 
hOracle.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren