SQL: Insert Daten aus einer anderen Tabelle in einer Tabelle mit Fremdschlüssel
In einer SQL-DATENBANK
Ich habe eine Tabelle Benutzer
Id Name Age AddressId
----+------+------+-----------
Where AddressId ein Fremdschlüssel auf eine Tabelle, Namen, Anschriften
Adressen Tabelle:
Id Country State City ZipCode
----+---------+------+------+---------
Dies ist eine EINS-ZU-EINS-Beziehung: Jeder Benutzer Hat 1 Adresse, und jede Adresse hat ein Benutzer
Habe ich eine neue Tabelle mit dem Namen NEWUsers
Id Name
----+------
Es hat nur Id und Name.
Was ich tun will, ist dies:
Schreiben Sie ein Skript einfügen alle Datensätze Aus der NEWUSers-Tabelle in der Benutzer-Tabelle.
- Ich will Das Alter auf Standard-20 für alle neuen Benutzer
- Und für jeden neuen Benutzer eingefügt, die ich brauche, um erstellen Sie einen neuen adressdatensatz für ihn
- die neue Adresse Datensatz werden alle Werte (Land, Stadt, Staat, Postleitzahl) gleich "abcd" mit Ausnahme der Id, die verwendet werden, um die foreign-key-AddressId für den neuen Benutzer)
Wie kann ich das tun?
Ich habe versucht, die folgenden:
INSERT INTO Users(Name, Age)
Values((SELECT Name FROM NewUsers),20)
Aber ich weiß nicht, wie man erstellen Sie einen neuen adressdatensatz für jeden Benutzer eingefügt, und geben Sie den Fremdschlüssel entsprechend.
Vielen Dank für jede Hilfe
- ist die
Adresses.Id
eineIDENTITY
? - für die neue Adresse erstellen beim einfügen von neuen
User
sollten Sie sich entscheiden, zu erstellentrigger
die ausgeführt wird, nachdem Sie legen Sie neue Benutzer an. - ja, es ist Identität
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnte es eine Methode mit zwei Abfragen, die gebildet werden, wie die folgenden:
Edit: Eine einfache Möglichkeit zur Verknüpfung der Benutzer zu den Adressen wäre, vorübergehend das Land zu einem der Benutzernamen. Dann hätte man eine Verknüpfung, um zu bestimmen, die addressId. Sobald die Benutzer-Tabelle wird aufgefüllt, und verknüpft korrekt, können Sie Land wieder auf den Standardwert
abcd
:Demo: http://www.sqlfiddle.com/#!3/1f09b/8
Gibt es komplexere Möglichkeiten, dies zu tun, wenn Sie gewährleisten wollen, transaktionale Konsistenz, wenn mehrere Einsätze gleichzeitig passieren kann, oder wenn Sie möchten, dass doppelte Namen, etc. Aber basierend auf dem Beispiel, das Sie gegeben haben, und details, so weit, diese Methode sollte funktionieren.
Dies ist etwas hacky, aber es macht, was du willst, in beiden Aussagen - vorausgesetzt, es ist kein Benutzer mit den Namen 'abcd' oder geben Sie diese für Ihr Land, und dass Sie purge-die NewUsers-Tabelle nach dieser operation:
OUTPUT
Klausel 🙂Schreiben Sie den Cursor Zum Einfügen In die Benutzer und die Adresse-Tabelle Mit Forign key
Vorausgesetzt, Sie können die AddressId, aber Sie wollen,...
Wenn AddressId ist eine identity-Spalte ist, können Sie deaktivieren die Identität vorübergehend Erster. Sehen SET IDENTITY_INSERT für die info und Beispiele.
Ehrlich, die Antwort ist, dass Sie nicht wollen, zu tun, was Sie denken, Sie tun möchten. Wenn der Benutzer eine und nur eine Adresse, wie Sie gesagt, dann sollten Sie nur eine Tabelle (user), der die Adresse enthält Felder. Modellieren Sie Ihre Daten richtig machen werden, dieses problem gehen Weg intrinsisch.