2017-05-18 3 views
0

eine andere Spiegelung machen Ich habe zwei Tabellen, die einen Benutzer und andere genannt Profile. Jede dieser Tabellen hat eine Spalte namens user_id. Was ich tun möchte, wenn ich einen neuen Benutzer in die Benutzertabelle einfüge, möchte ich automatisch ihre neue user_id in der Benutzertabelle in die Profiltabelle kopieren. Ich möchte die UPDATE-Klausel nicht verwenden, da ich sie dann jedes Mal aufrufen müsste, wenn ich einen neuen Benutzer hinzufüge. Ich dachte, dass Relationen erreichen würden, was ich versuche, also habe ich die user_id von Profilen auf die user_id von Benutzern verweisen lassen und sie wird immer noch nicht automatisch aktualisiert. Was soll ich machen? Und was ist der Sinn von Beziehungen in erster Linie, wenn sie Ihre Spalten nicht automatisch aktualisieren?Wie man eine Spalte in mysql

+1

Sie können einen 'AFTER INSERT'-Trigger für die Tabelle' users 'verwenden, um ihn automatisch in die 'profiles'-Tabelle einzufügen. – Barmar

+0

würden Sie in diesem Fall einen Trigger machen, um die andere entsprechende Zeile einzufügen. – Randy

+0

Die Beziehungen zwischen Tabellen sind normalerweise nicht eins zu eins, automatische Updates wären daher nicht angemessen. Wie würde es auch wissen, was in die anderen Spalten eingefügt werden soll, wenn es automatisch eingefügt wird? – Barmar

Antwort

1

Dies ist wahrscheinlich ein Konstruktionsfehler. Wenn Zeilen in diesen beiden Tabellen immer mit denselben IDs existieren, sollten sie wahrscheinlich eine einzelne Tabelle sein.

Der Fremdschlüssel Sie erstellt haben garantiert, dass jede Zeile die in profiles existiert müssen die gleiche ID wie eine Zeile in users haben. Diese Zeilen werden nicht erstellt. Das bedeutet nur, dass beim Versuch, eine Zeile mit einer ID zu erstellen, die nicht übereinstimmt, die Datenbank einen Fehler auslöst.

Das alles gesagt wird, ist es möglich, einen Auslöser zu erstellen zu tun, was Sie beschreiben:

CREATE TRIGGER user_insert_creates_profile 
    AFTER INSERT ON users 
FOR EACH ROW 
    INSERT INTO profile (user_id) VALUES (NEW.user_id); 

Aber es ist wahrscheinlich besser, Ihr Design zu überdenken, oder der Einsatz in der Anwendung zu tun. Trigger werden am besten vermieden.

+0

Alles klar, danke! Ursprünglich wollte ich es zu einem einzigen Tisch machen, aber dann würde es so viele Spalten geben, die das Lesen in cmd erschweren würden. Ich nehme an, das ist kein großes Problem. –

Verwandte Themen