SQL Insert Statement

cojack20

Mitglied
Hallo.

Leider bin ich ein totaller Nixkoenner im Bereich SQL und brauche von euch die Starthilfe. Ich kenne die ganzen Hintergruende und so weiter und brauche nur mal einen der mir ein fuer mich angepasstes Beispiel bringt :)

Folgendes Problem:
Ich habe eine Tabellenstruktur die folgendermassen aussieht. Als DB System benutze ich sqlite:

1te Tabelle "Names":
[UID, Names] UID ist Primary Key

2te Tabelle "Folder":
[uid, folder] UID ist Primary Key

3te Tabelle "Receivers":
[smsId, namesId] smsId if Foreign Key von SMSTable, namesId ist Foreign Key von Names

4te Tabelle "SMSTable" ist die Haupttabelle:
[UID, folder, sender, receiver, sentdate, text] UID ist Primary Key, folder if Foreign Key von Folder, sender ist Foreign Key von Names, receiver ist Foreign Key von Receivers

Frage1:
Leider habe ich nicht wirklich die Ahnung ob das so geht. Weil eine SMS mehrere Receiver haben kann. Da das eine M:N Beziehung ist brauche ich ja eine eigene Tabelle, oder

Frage2:
Kann mir jemand ein Insert Statement schreiben, dass mir eine SMS (z.b. die folgende) in die obrigen Tabellen einfuegt?
[SMSItem: Folder = "Posteingang", Sender = "Max Mustermann", Receiver = "Hans Glueck, Michael Jackson, Erich Honnecker", SentDate = "800...01452' (ist ein java long. Ist einfacher fuer meine Erstellung der Date Obj), Text = "Hallo Welt"]

VIELEN VIELEN DANK das wuerde mir wirklich weiterhelfen
 
Ich hätte mal das folgende Statements versucht (nicht getestet und ich hab auch schon nen paar Wochen nix mit der DB gemacht).

Code:
INSERT INTO table Names (UID, Names) VALUES (1, "Max Mustermann");

INSERT INTO table Folder(UID, folder) VALUES (1, "Posteingang");

INSERT INTO table smstable(UID, folder, sender, sentdate, text) VALUES (1,(SELECT UID FROM Folder WHERE Names = "Posteingang"), (SELECT UID FROM Names WHERE folder= "Max Mustermann"),800...01452, "Hallo Welt" );

Das mit dem Receivers verwirrt mich etwas. Du verweist ja einmal von smstable auf Folder und dann genau umgekehrt. Ich weiß jetzt net ob das geht sieht auf die schnelle komisch aus. Ich hätte einfach Receivers angelegt (also analog zu Names) und die dann per UID FK eingefügt.

Oder warum machst du das so? Also wie gesagt kein Plan kann auch funktionieren, bloss wie :-)
 
Vielen dank erstmal fuer deine Antwort! Nur genau Receiver ist mein Problem! :)

Folgendes Problem: eine SMS kann natuerlich an mehr als einen Empfaenger gesandt werden. Was natuerlich dazu fuehrt, dass man irgendwie speichern muss wer welche SMS bekommen sollte.
Da wir 1:N (1 Sms zu N Leuten haben) kann ich das ja nicht in der Maintable speichern OHNE die ganzen anderen Werte mit zuduplizieren. Deshalb brauche ich einen Verweis (foreignkey ) auf die UID von der SMS und dann N-Zeilen die bestehen aus (SMS-UID, Names-UID).
Sowas wie:

ReceiverTable:
[ SMS1, NAME170]
[ SMS1, NAME34]
[ SMS1, NAME200]

NameTable:
[ NAME170, "Erich Honecker"]
[ NAME34, "Super Man"]
[ NAME200, "Mensch Mueller"]


Hmm wie mache ich das nur jetzt in der SMS Haupttabelle
 
OK :-) das versteh ich, ist ein Problem ABER ich weiß jetzt nicht wie man das anders lösen könnte ALSO ohne das Zeugs dann dreimal zu speichern.
 
Moin keks1984,
OK :-) das versteh ich, ist ein Problem ABER ich weiß jetzt nicht wie man das anders lösen könnte ALSO ohne das Zeugs dann dreimal zu speichern.

Die einzige (mir einfallende) Variante wäre, in das Datenmodell noch eine Entität "Empfängergruppe" als Spezialfall der Entität "Empfänger" einzubauen.

Sprich, eine Empfänger-ID verweist entweder auf eine Person-Id in einer anderen Tabelle oder aber auf x Person-Ids in genau dieser.
Wäre also eine Analogie zu den "Verteiler"-Mimiken bei Outlook o.ä.

Wenn diese SMS-an-mehrere-Versendung in dem kontext oben nix Ungewöhnliches ist, dann lohnt sich das Einziehen dieser Zwischenebene.

Grüße
Biber
 
Moin keks1984,


Die einzige (mir einfallende) Variante wäre, in das Datenmodell noch eine Entität "Empfängergruppe" als Spezialfall der Entität "Empfänger" einzubauen.

Sprich, eine Empfänger-ID verweist entweder auf eine Person-Id in einer anderen Tabelle oder aber auf x Person-Ids in genau dieser.
Wäre also eine Analogie zu den "Verteiler"-Mimiken bei Outlook o.ä.

Wenn diese SMS-an-mehrere-Versendung in dem kontext oben nix Ungewöhnliches ist, dann lohnt sich das Einziehen dieser Zwischenebene.

Grüße
Biber


Hallo Biber!
bitte korrigiere mich wenn ich das falsch verstanden habe. Meine Receivertabelle macht doch genau das. Ich speicher entweder ein Multivalue (1 smsId 1 Empfänger und die gleiche smsID mit dem nächsten Empfänger in der nächsten Zeile usw...) oder ein Einzelvalue (1 smsId und 1 Empfänger = 1 Zeile und fertig)

Nur wie schreibe ich das als sql insert statement?

Ich meine ich habe hier eigentlich nicht das Spezialfall Problem, oder? Nehmen wir mal an ich habe eine Tabelle und habe einen Fremdschlussel in dieser Tabelle, dann füge ich das so ein wie Keks gesagt hat. Aber was ist denn wenn in einer Tabellenzelle eigentlich mehrere Werte stehen sollten (Verletzt die erste Nomalform). Wie löst ihr das dann. Die Tabellenzeile kopieren nur mit einem anderen Wert für den Multivalue ist ja definitiv nicht irgendeine normalisierte Form.
 
Moin cojack20,

ih versuchs noch mal - vielleicht bin ich ja aber auch auf dem falschen Trip grade.

Meine idee war statt diesem hier:
"3te Tabelle "Receivers":
[smsId, namesId] smsId if Foreign Key von SMSTable, namesId ist Foreign Key von Names"

...eine Tabelle "Receivers" dieser Form
3te Tabelle "Receivers":
[smsId, nameOrGrpId] smsId if Foreign Key von SMSTable, nameOrGrpId ist ein FK auf nameOrGrpTable

Neue Tabelle 3b: NameOrGrpIDTable [eventuell NUR VIRTUELL- hat ja KEINE ATTRIBUTE]
[nameOrGrpId] Autoincrement-Wert

Neue Intersection-Tabelle fur Zuordnung nameOrGrpID zu einer oder mehreren UserIDs
[nameOrGrpId] nameOrGrpId ist ein FK auf nameOrGrpTable
[NameId] ist FK auf Names-Table
PK ist natürlich die Kombination aus beiden.

Bedeutet: wenn automatisch eine UID oder ein AutoIncrementWert den PK für eine neu angelegte SMS generieren kann, dann kannst Du doch ebensio einen neuen Satz mit einer Eindeutigen ID in der Tabelle namesOrGrpTable erzeugen. -->BEVOR Du genau diesen Wert als FK in die ReceiversTable einträgst.

Wenn Du die Skizze (eigentlich ist es ja eher das losische Modell) auf das physikalisch umsetzbare umänderst könnte es heißen:
Die neue Tabelle Neue Tabelle 3b: NameOrGrpIDTable sieht z.b so aus:
[nameOrGrpId] Autoincrement-Wert ist der PK
[maxdatum] Timestamp-wert, Default current_timestamp
[Dummy] Char(8)
--> die "neueste" bzw. eine frische ID nameOrGrpID bekommst Du immer mit einem
Code:
 Insert into NameOrGrpIDTable (dummy) values ('MfG Biber');
SELECT n.NameOrGrpID ,
( SELECT max(maxdatum) as datum from NameOrGrpIDTable) as max
FROM NameOrGrpIDTable n
Where n.maxdatum = max.Datum;
Und damit hast Du die ID, die Du zum Inserten genau eines Satzes in die Receiver-Table und zum Inserten eines oder auch 14 neuen Sätzen der Form (dieseId, NamesID) in die Zuordnungstabelle [3b] brauchst.

klarer geworden?

Grüße
Biber
 
Zurück