Forum: PC-Programmierung SQL und Daten in zwei Tabellen ändern


von mikeii (Gast)


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

von Sebastian L. (Gast)


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

von mikeii (Gast)


Lesenswert?

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

Ich habe jetzt was gefunden "On Update Cascade"

On Delete Cascade geht eins A, aber bei On Update Cascade meint er 
Missing Keyword?

von Εrnst B. (ernst)


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.

von mikeii (Gast)


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

von mikeii (Gast)


Lesenswert?

Fehlermeldung

Fehler beim Start in Zeile 7 in Befehl:
ALTER TABLE arbeitet ADD CONSTRAINT arbeitet_fk FOREIGN KEY (DJName) 
REFERENCES DJ(DJName) ON UPDATE CASCADE
Fehlerbericht:
SQL-Fehler: ORA-00905: Schlüsselwort fehlt
00905. 00000 -  "missing keyword"
*Cause:
*Action:

von Sebastian L. (Gast)


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)

von mikeii (Gast)


Lesenswert?

Ich hab doch den DJName als Primärschlüssel und möchte den in arbeitet 
als Fremdschlüssel. Das geht auch ohne Probleme auch mit ON DELETE 
CASCADE, aber OD UPDATE CASCADE geht hier nicht. Und ich find keine 
Lösung dazu wie ich das anderst machen kann.

Ich such mal weiter

von mikeii (Gast)


Lesenswert?

Habe gerade erfahren, dass die Lösungen nicht Oracle Konform sein 
müssen, von daher ist ON UPDATE CASCADE völlig ok.

Danke für die Hilfe

von Εrnst B. (ernst)


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.

von Joerg (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.