Kann INSERT Wert aus anderer Tabelle holen?

xumba

Neuer Benutzer
Beiträge
2
Hallo, ich hab folgendes Problem.

meine Tabelle (TABELLE1) sieht so aus:

T1.JPG

Der "Lange Name" ist einige male unterschiedlich, wiederholte sich aber meist. Um Platz zu sparen hab ich mir folgendes vorgestellt .

Ich erstelle eine zweite Tabelle (TABLELLE2) in der Form:

T2.JPG

und in der ersten Tabelle (TABELLE1) steht nur noch die ID des "Langen Namen". Also:

T3.JPG

So weit so gut. Aber, kann ich die Tabellen so verknüpfen dass mein "Lade-Programm" trotzdem einen INSERT Befehl in der Form:

INSERT INTO TABELLE1 (Langer_Name,Zahl-1,Zahl-2,Zahl-3,Zahl-4 ) VALUES ('ErsterLangerName','11','12','13','14')

Absetzt und der Server dann folgendes macht:
  • wenn der Lange Name existiert, dann nur die ID aus TABELLE2 in TABELL1 eintragen.
  • wenn der Lange Name neu ist erst den Namen mit einer neuen ID in TABELLE2 eintragen. Dann die neue ID (und die Zahl-n Werte) in TABELLE1

Gruß Xumba
 
Werbung:
Ich bin kein mySQL Experte und will es auch nicht werden.
Ich denke, mySQL kann es nicht. Ist aber auch nicht schlimm, da Du diese Aufgabe einem Select übergeben kannst, dass diese Problematik löst.
Ziemlich einfach, wenn es nur um existierende Daten bei der Spalte LangeName geht.
Sobald auch LangerName in der anderen Tabelle eingefügt werden muss, würde man wohl um eine Function nicht herum kommen.
ungefähr: stored function langername_getid(langername varchar)
Die würde einem im einfachen Fall die benötigte ID liefern, die zu langername gehört.
Ist der Wert nicht vorhanden, muss sie ihn vorher einfügen und dann die frische ID zurückgeben.

Ein anderer Weg, der nicht unüblich ist: StoredProcedures für Einfügeoperationen.
Du baust gleich ein komplettes Insert nach, das alle Spalten (wahrscheinlich ohne ID) entgegen nimmt.
Im Rumpf kannst Du dann alles veranstalten, was wirklich nötig ist, um den Wert einzufügen.
Das kann man auch systematisch machen, für jede Tabelle bzw. eher für jede Business Operation, die das System können muss. Ergibt wenn es fertig ist ein schönes Interface, dass ohne Kummer aufrufbar sein sollte. Ein solches Interface erhöht auch die Flexibilität bei Tabellenänderungen / -erweiterungen. Du kannst "hinterm Vorhang" also hinter Deinen Business Operationen Tabellen umbauen, ohne dass die Aufrufparamter geändert werden. Nur der Rumpf der SP müsste geändert werden. Die Anwendung muss es nicht mitkriegen. Dazu gehört natürlich auch die andere Seite, Selects die man analog zu den SP in Views kleiden würde.
 
Hallo dabadepdu,

danke für die Info. Es bleibt also "nur" die Möglichkeit das "Lade-Programm" anzupassen. Also da eine StoredProcedure zu verwenden.
Hatte eigentlich gehofft dass es sowas wie einen Trigger am Server gibt über den man, wen ein INSERT "rein kommt" die SP ausführt.

Weiß Du zufällig ob MS SQL so eine Trigger Möglichkeit hat?

Gruß Xumba
 
Werbung:
Bei MSSQL gibt es das auf jeden Fall, bei MySQL aber vielleicht auch:

Du könntest eine Tabelle anlegen und dann eine Sicht da drauf erstellen die zu Langer_Name_ID per Join den richtigen Langer_Name holt. Auf die Sicht legst du einen Instead of-Trigger. Die Anwendung nutzt die Sicht wie eine Tabelle und wenn ein INSERT INTO an die Sicht "geschickt" wird dann wird der Trigger gestartet. Im Trigger gibt es dann die Tabelle INSERTED (bzw. new oder so in MySQL) und aus der holst du dir die neuen Datensätze. Und dort kannst du dann sagen das statt dessen in die eigentlichen Tabellen geschrieben wird.

Unter MSSQL mache ich das in vielen Fällen.
 
Zurück
Oben