[PostgreSQL] einfügen ohne Doubletten

SuperSonik

Erfahrenes Mitglied
Hallo Leute,
ich bäuchte Hilfe bei einem INSERT Befehl.

Ich habe 3 Tabellen:

Tabelle mitarbeiter:
uid
name
vorname
strassen_uid
plz_uid

Tabelle strassen:

uid
strasse

Tabelle postleitzahlen:

uid
plz


So, jetzt meine Frage: Gibt es eine Möglichkeit ein INSERT so hinzubekommen das ich einen neuen Mitarbeiter anlegen kann und in die Mitarbeiter-Tabelle auch sofort die richtigen uids stehen habe. Und das ganze ohne in strassen und postleitzahlen Doubletten zu erzeugen.

Also so etwas wie:
Trage name und vorname ein und trage für die strassen_uid die entsprechende uid ein falls die Strasse schon vorhanden ist. Ansonsten lege die Zeile mit der Strasse neu an und trage diese uid bei mitarbeiter ein. Bei der plz dann genauso.


Ich weiß nicht ob sich sowas nur mit SQL aufbauen läßt...

Vielen Dank schonmal,

Sonik
 
Das macht es ja schon möglicher ^^ :D

Ich kann dir jetzt leider keine Copy-Paste Lösung liefern, da ich zuhause keinen PostgreSQL-Server habe und leider auch die Syntax da nicht kenne.

Hier ist aber eine Prozedur wie man sie für Firebird schreiben würde:

SQL:
SET TERM ^;
CREATE PROCEDURE mitarbeiterHinzufuegen(I_Name VARCHAR(60), I_Vorname VARCHAR(60), I_Strasse VARCHAR(60), I_Plz VARCHAR(5))
AS
   DECLARE VARIABLE V_StrasseId INTEGER DEFAULT NULL;
   DECLARE VARIABLE V_PlzId INTEGER DEFAULT NULL;
BEGIN
   /* 
     Sucht ob schon ein Eintrag mit der Straße vorhanen ist und speichert bei fund die Id davon in die Variable V_StrasseId.
     Mit Upper() hebe ich die Unterschiede bei Unterschiedlicher Groß- und Kleinschreibung auf!
   */
   FOR SELECT uid FROM strassen where Upper(strasse) = Upper(:I_Strasse) INTO :V_StrasseId
   DO BEGIN END
 
   /*
     Wenn keine passende Strasse gefunden wurde, ist die Variable V_StrasseId noch immer NULL (da ich es mit Defaul so bestimmt habe!).
   */
   IF (:V_StrasseId is NULL) THEN
   BEGIN
      -- Ermittle die nächste ID für den nächsten Datensatz in der Tabelle strassen und speicher die ID in der Variable V_StrasseId zwischen.
      SELECT GEN_ID(strassen_sequence, 1) FROM RDB$DATABASE INTO :V_StrasseId;
      
      -- Füge die neue Straße mit der gerade ermittelten ID der Tabelle strassen hinzu.
      INSERT INTO strassen (uid, strasse) VALUES (:V_StrasseId, :I_Strasse);
   END
 
   
   /* 
     Sucht ob schon ein Eintrag mit der PLZ vorhanen ist und speichert bei fund die Id davon in die Variable V_PlzId.
     Mit Upper() hebe ich die Unterschiede bei Unterschiedlicher Groß- und Kleinschreibung auf!
   */
   FOR SELECT uid FROM postleitzahlen where Upper(plz) = Upper(:I_Plz) INTO :V_PlzId
   DO BEGIN END
 
   /*
     Wenn keine passende PLZ gefunden wurde, ist die Variable V_PlzId noch immer NULL (da ich es mit Defaul so bestimmt habe!).
   */
   IF (:V_PlzId is NULL) THEN
   BEGIN
       -- Ermittle die nächste ID für den nächsten Datensatz in der Tabelle postleitzahlen und speicher die ID in der Variable V_PlzId zwischen.
      SELECT GEN_ID(postleitzahlen_sequence, 1) FROM RDB$DATABASE INTO :V_PlzId;
 
      -- Füge die neue PLZ mit der gerade ermittelten ID der Tabelle postleitzahlen hinzu.
      INSERT INTO postleitzahlen (uid, plz) VALUES (:V_PlzId, :I_Plz);
   END
 
   /*
      Füge schlussendlich den Mitarbeiter der Tabelle mitarbeiter hinzu. Auch hier wird die id des Mitarbeiters über eine Sequence ermittelt.
   */
   INSERT INTO mitarbeiter (uid, name, vorname, strassen_uid, plz_uid) VALUES(GEN_ID(mitarbeiter_sequence, 1), :I_Name, :I_Vorname, :V_StrasseId, :V_PlzId);
END^

Du musst jetzt diese Version in die Syntax von PostgreSQL übersetzen, wenn du das nicht schaffen solltest (selber versuchen muss aber schon sein!) und keiner hier im Forum dir dabei helfen kann, melde dich und ich versuche mich mal daran. Allerdings kann das etwas dauern da ich mich erst in die Syntax von PostgreSQL einarbeiten muss.

Das Einfügen eines Mitarbeiters muss jetzt so aussehen:

SQL:
SELECT * from mitarbeiterHinzufuegen('Super', 'Sonic', 'TestStrasse', '56545');

Hiermit hast du sichergestellt, dass wenn eine Straße oder eine PLZ schon vorhanden ist, diese auch benutzt wird und erst wenn diese nicht vorhanden sind neu angelegt werden (und dann benutzt werden!).

Allerdings solltest du beachten, wenn du in dem Strasse-Feld auch die Hausnummer eintragen willst, das sogut wie keine redundaten Daten enstehen werden, denn das man die gleiche Straße mit der gleichen Hausnummer (und das gleich geschrieben) nochmals trifft dürfte sehr unwahrscheinlich sein. Bei PLZ kann und wird das aber durchaus öfters passieren.

Hoffe dir damit etwas geholfen zu haben.

Gruß
RudolfG
 

Neue Beiträge

Zurück