MySQL - Bei Zusammenführen von zwei Tabellen Auto_Increment Spalte erstellen

eingeist

Grünschnabel
Hallo Community,

ich habe an der Ausgabe von zwei Tabellen bereits auch einige Stunden gebastelt und bin heute auf das Ergebnis gekommen, welches soweit auch funktioniert.
Wär ich früher auf dieses Forum gestoßen, hätte ich mir viel Zeit erspart und es wäre leichter gewesen. Aber es hat mir nicht geschadet intensiv zu recherchieren und mich durch einige Erklärungen durchzukämpfen. Da ich aber in diesem Bereich noch ein ziemlicher Anfänger bin, hab ich z.T. noch leichte Verständnisschwierigkeiten.
Aber wie gesagt, ich bekomme bereits aus zwei Tabellen mit Union die gewollten Ergebnisse geliefert.
Ein Problem bleibt dabei aber: In beiden Tabellen befindet sich eine für die jeweilige Tabelle eindeutige ID. Da aus beiden Tabellen die nur in den jeweiligen Tabellen eindeutige ID ausgelesen wird, kann es passieren, daß in der Endtabelle die ID-Spalte in einem ungünstigen Fall nicht mehr eindeutig ist. Dies stört evtl. die Ausgabe nicht, aber eine weitere Verarbeitung in einem Programm gestaltet sich dann doch sehr unkonfortabel. Besteht die Möglichkeit, daß man der gelieferten Tabelle eine Auto-Increment-Spalte bei der Select Abfrage hinzufügt um eine Eindeutigkeit zu gewährleisten?

Würde mich freuen, wenn mir jemand einen Tipp geben könnte. Selbst wenn sich herausstellt, daß es mit MySQL nicht so klappt wie ich's gern hätte.

Danke schon mal für's lesen!

Viele Grüße,

Ben

Edit:
Sorry, hab vorhin in der Eile mein Beispiel vergessen:
Code:
(SELECT Historyid, Null as ID, Typ, Ereignis, Null, Datum
FROM tabHistory
WHERE `Typ` = 'Bericht') 
Union 
(SELECT Null, BestandID, Typ, Ereignis, Folgeaktion, Datum
FROM tabBestand
WHERE `Typ` = 'Bericht') 
ORDER BY Datum ASC;
Die Ausgabe paßt soweit. Ich befürchte nur, daß in einem sehr ungünstigen Fall eben zwei mal die selbe ID bei HistoryID und BestandID auftaucht. Daher hab ich sie in zwei unterschiedliche Spalten gegeben und hätte gerne eine eindeutige ID-Spalte mit Auto_Increment. Ist sowas überhaupt möglich?
 
Zuletzt bearbeitet:
Habe gerade etwas in der Doku vom Mysql gesucht allerdings keine Funktion gefunden mit der man das realisieren könnte.
Eventuell wenn man eine temporäre Tabelle erstellen würde.

Ich hätte da allerdings noch eine andere Idee.
Man könnte einen MD5 Hash über Historyid, Typ und Datum erstellen, welche dann "eindeutig" sein sollte.

Also so hab ich mir das gedacht:
SQL:
(
    SELECT 
        MD5(Historyid+Typ+Datum) AS pID
        Historyid, 
        Null as ID, 
        Typ, 
        Ereignis, 
        Null, 
        Datum
    FROM tabHistory
    WHERE `Typ` = 'Bericht'
) UNION (
    SELECT 
        MD5(BestandID+Typ+Datum) AS pID
        Null, 
        BestandID, 
        Typ, 
        Ereignis, 
        Folgeaktion, 
        Datum
    FROM tabBestand
    WHERE `Typ` = 'Bericht'
) 
ORDER BY Datum ASC;
 
Hallo Friesi!

Vielen Dank für Deine Antwort! Zum Einen, daß Du mir die Scheuklappen bzgl. der Auto_Increment Geschichte weggenommen hast und zum Anderen, daß Du mir dadurch auch gleich einen Lösungsvorschlag gegeben hast.

Ich hab natürlich gleich mal rumprobiert ... und dachte, wenn man MD5 wegläßt müßte doch der entsprechende String im "Klartext" zu erhalten sein. Hat irgendwie nicht ganz geklappt. Da ich aber keinen MD5 Hash brauche, hab ich weitergebastelt und gelesen und mir folgende Lösung erarbeitet:
Code:
(
    SELECT 
        CONCAT(CAST(Historyid as Char), 'H') AS pID
        Historyid, 
        NULL AS ID, 
        Typ, 
        Ereignis, 
        NULL, 
        Datum
    FROM tabHistory
    WHERE `Typ` = 'Bericht'
) UNION (
    SELECT 
        CONCAT(CAST(BestandID as Char), 'B') AS pID
        NULL, 
        BestandID, 
        Typ, 
        Ereignis, 
        Folgeaktion, 
        Datum
    FROM tabBestand
    WHERE `Typ` = 'Bericht'
) 
ORDER BY Datum ASC;

Zur Erklärung:
CAST(HistoryID as Char) zur Konvertierung der ID als String
CONCAT(... , ...) zum Zusammenfügen der Zeichen

Also Friesi, vielen Dank nochmal!

Sollte jemand aber doch noch wissen oder erfahren, wie man die erste Spalte als eigenständige Auto_Increment führen kann, würde ich mich über eine Antwort freuen. Lerne gerne dazu.
Auch anderen Ideen über bin ich natürlich aufgeschlossen.

Viele Grüße,

Ben
 
Zuletzt bearbeitet:
MySQL?

1) Normalerweise ergänzt man den Schlüssel beim UNION direkt
2) oder als 2tes eindeutiges Feld
3) oder man erstellt wirkliche eine neue ID analog einer Zeilennummer (Beispiel der Zeilennummerierung in MySQL)

SQL:
--Eindeutiger Schlüssel mit Prefix
SELECT 
    CONCAT('A', a.id) AS unionid,
    a.feld1
FROM tableA AS a
UNION SELECT
    CONCAT('B', b.id) AS unionid,
    b.feld1
FROM tableA AS b

--Schlüssel Eindeutig über 2 Felder. source und id
SELECT 
    'A' AS source,
    a.id,
    a.feld1
FROM tableA AS a
UNION SELECT
    'B' AS source,
    b.id,
    b.feld1
FROM tableA AS b

--oder in MySQL ein wirklich neue ID,
SELECT
    @rownum:=@rownum+1 AS rownum,
    t.*
FROM
    (SELECT @rownum:=0) AS vars,
    (SELECT 
        a.id,
        a.feld1
    FROM tableA AS a
    UNION SELECT
        b.id,
        b.feld1
    FROM tableA AS b) AS t
 
Zuletzt bearbeitet von einem Moderator:
Zurück