Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
26.10.2009, 18:25
speziFanta



Das Topic dürfte mein Problem bereits gut beschreiben, auch wenn ich weiß, dass das so nicht geht.

Folgends Problem:
Ich habe zwei Tabellen mit einer user_ID und möchte in Tabelle 2 nur dann einen neuen Usereintrag erstellen, wenn die user_ID noch nicht in Tabelle 1 vorhanden ist.

INSERT bietet einem die Möglichkeit dieses Problem mit einem Workaround zu lösen, indem man ON DUPLICATE KEY UPDATE verwendet, jedoch funktioniert dieser nur (afaik), wenn es sich um die gleiche Tabelle handelt.

Quellcode:INSERT INTO table_1 (user_id)
VALUES ($userid)
ON DUPLICATE KEY UPDATE user_id = $userid
$userid ist jetzt einfach ein Platzhalter.
In diesem Beispiel wird die user_id nur eingetragen, wenn sie noch nicht vorhanden ist, ansonsten wird sie ersetzt (alternativ geht auch "user_id = user_id", dann passiert gar nichts; oder "INSERT IGNORE").

Bei mir sind es eben nur zwei Tabellen und sich suche eine Möglichkeit diese zu verknpüfen.

Gedachte hatte ich jetzt schon an einen TRIGGER BEFORE INSERT (Credits gehen an dieser Stelle an Lejean), der meinen Eintrag prüft. Aber wie sage ich dem TRIGGER jetzt, dass er mein INSERT ablehnen soll, wenn bereits ein Eintrag in der anderen Tabelle vorhanden ist?

--

Heute schon gegoogelt?
spezi|Clan
TheWall.de - wo jeder alles sein kann.


Dieser Beitrag wurde am 26.10.2009 um 18:36 von speziFanta bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
001
26.10.2009, 21:08
Bluthund



Normalerweise würdest du in dem Fall, dass dein Bedingung nicht zutrifft, die laufende Transaktion zurückfahren (ROLLBACK). Laut Referenzhandbuch wird das (Transaktionsbefehle in SPs und Triggern) allerdings von MySQL leider nicht unterstützt.
Eine andere Möglichkeit, die mir in den Sinn kommt, wäre ein Check-Constraint, aber auch hier sagt MySQL: "No can do." Es gibt ne Lösung das ganze unter MySQL zu emulieren. Allerdings ist es imho nicht die feine englische Art einen Fehler heraufzubeschwören nur damit ne Aktion abgebrochen wird. Allerdings scheint das (nachdem was man im Web so findet) in MySQL der einzige Weg zu sein einen Trigger abzuwürgen.
Was mir jetzt noch als Alternative einfallen würde, wäre, dass du eine Stored Procedure zum Einfügen der Daten nimmst. Beispielhaft:
Quellcode:DELIMITER $$
CREATE PROCEDURE sp_insert_user (new_user_id INT)
BEGIN
  IF (SELECT COUNT(user_id) FROM table_1 WHERE table_1.user_id = new_user_id) = 0 THEN
    INSERT INTO table_2 VALUES (new_user_id);
  END IF;
END;
$$
DELIMITER ;
Aufruf:Quellcode:CALL sp_insert_user ($user_id); Das ist natürlich je nach Strukturierung der Software vielleicht nicht in deinem Sinne.

Aber vielleicht hast du Glück und es kommt noch jemand des Weges, der rosigere Nachrichten zu überbringen hat.

PS: Warum besteht da überhaupt so eine Abhängigkeit im Datenmodell? Evtl. kannst du da auch etwas umstrukturieren und davon ganz wegkommen, das Einfügen in die eine Tabelle von der anderen abhängig zu machen?

--

The C language combines all the power of assembly language with all the ease-of-use of assembly language.
"humorig is n blödwort :>" by -CarniGGeLjumpR-

zum Seitenanfang zum Seitenende Profil || Suche
002
29.10.2009, 15:16
speziFanta



Puh... ich hatte das jetzt einfach mit einem zusätlichen Query gelöst:

Quellcode:DELETE  FROM table_1 AS tb1
WHERE table_1.user_id IN
(
    SELECT user_id
    FROM table_2
    WHERE userid = tb1.user_id
)
Um doppelte Einträge wieder zu löschen. Funktioniert, nur ~~

Aber deine Stored Procedure ist, wenn ich das richtig verstanden habe, genau das, was ich gesucht habe.

Edit: Ja, habe es jetzt mit einer Procedure gelöst und bin damit sehr zufrieden. Danke dir.

--

Heute schon gegoogelt?
spezi|Clan
TheWall.de - wo jeder alles sein kann.


Dieser Beitrag wurde am 29.10.2009 um 16:14 von speziFanta bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche