Instert Into über mehrere Tabellen
undso
- datenbank
1 Vinzenz Mai0 dr.colossos0 undso0 Vinzenz Mai0 undso1 Vinzenz Mai0 undso
0 dr.colossos0 undso
Hallo liebes Forum,
leider wieder eine Datenbankspezifische Frage.
Ich muss immer eine Zeile in mehrere Tabellen einfügen. Ist das mit einer Query möglich?
Insert Into tabelle1, tabelle2 (spalte1) values (12345);
Grüße
Hallo,
Ich muss immer eine Zeile in mehrere Tabellen einfügen.
das bedeutet, dass mit hoher Wahrscheinlichkeit Dein Tabellendesign sehr
verbesserungswürdig ist.
Ist das mit einer Query möglich?
Insert Into tabelle1, tabelle2 (spalte1) values (12345);
welches Datenbankmanagementsystem (DBMS) in welcher genauen Version verwendest Du?
[ ] Access
[ ] dBase/FoxPro
[ ] DB2
[ ] Firebird
[ ] Informix
[ ] MS SQL Server
[ ] MySQL
[ ] Oracle
[ ] PostgreSQL
[ ] SQLite
[ ] eines der vielen, die ich hier nicht aufgezählt habe
Selbstverständlich sollte Dir ein Blick ins Handbuch sagen, was Sache ist,
z.B. für MySQL:
http://dev.mysql.com/doc/refman/5.0/en/insert.html
Findest Du dort eine Syntaxversion, die Deinem Wunsch nahekommt? Ich nicht.
Freundliche Grüße
Vinzenz
Hi,
ich denke das geht bei manchen Sonderlingen, standardisiert ist das nicht ... is auch nicht noetig. Zwei Tabellen, zwei queries.
Aber wie mein Vorredner schon sagte, die Tatsache dass du in zwei Tabellen schreibst heisst evtl. dass du Daten getrennt hast, die du nicht trennen musst.
Eine andere Loesung waere evtl. ein Trigger ...
Viel Erfolg
hi,
Ich muss immer eine Zeile in mehrere Tabellen einfügen.
das bedeutet, dass mit hoher Wahrscheinlichkeit Dein Tabellendesign sehr
verbesserungswürdig ist.
welches Datenbankmanagementsystem (DBMS) in welcher genauen Version verwendest Du?
[x] MySQL
Findest Du dort eine Syntaxversion, die Deinem Wunsch nahekommt? Ich nicht.
Ja, ich finde dort auch nichts, dann wohl am besten zwei Queries.
Wegen dem Verbesserungsbedürftig.
Ich hatte eine einzige Tabelle mit allen Userdaten (auch Profilangaben, Singleangaben und so) Alles in einer Tabelle. Waren ca. 200 Spalten *smile*
Habe das jetzt auf mehrere Tabellen aufgeteilt, sprich, etwas normalisiert und deshalb müsste ich bei einer Neuregistrierung in mehrere Tabellen für ein neues Mitglied eine Zeile anlegen.
Grüße
Hallo
Ich muss immer eine Zeile in mehrere Tabellen einfügen.
das bedeutet, dass mit hoher Wahrscheinlichkeit Dein Tabellendesign sehr
verbesserungswürdig ist.
welches Datenbankmanagementsystem (DBMS) in welcher genauen Version verwendest Du?
[x] MySQL
Ich wiederhole: welche *genaue* Serverversion?
Ja, ich finde dort auch nichts, dann wohl am besten zwei Queries.
Wegen dem Verbesserungsbedürftig.
Ich hatte eine einzige Tabelle mit allen Userdaten (auch Profilangaben, Singleangaben und so) Alles in einer Tabelle. Waren ca. 200 Spalten *smile*
Habe das jetzt auf mehrere Tabellen aufgeteilt, sprich, etwas normalisiert und deshalb müsste ich bei einer Neuregistrierung in mehrere Tabellen für ein neues Mitglied eine Zeile anlegen.
Dein Versuch der "Normalisierung" scheint etwas schiefgegangen zu sein.
Wobei sich das dann besser beurteilen ließe, wenn Du ein paar Tabellen
inklusive ein paar Beispieldaten vorstellen würdest. Jedenfalls entgeht
mir die Notwendigkeit, bei Neuanlage eines Datensatzes gleich noch ein
paar weitere anzulegen. Ich vermute, dass es nicht erforderlich wäre.
Und ja, dafür könnte man auch einen INSERT-Trigger verwenden. Es gibt doch
tatsächlich inzwischen verbreitete Unterstützung dafür (5.0.x oder höher).
Deswegen wiederhole ich nochmals das, was Du sowieso schon bei Deinem
Ausgangsposting einfach ignoriert hast:
Bei Datenbankfragen ist es stets eine gute Idee, das verwendete DBMS in
der verwendeten Version anzugeben. Bitte hole das nach. Bitte füge diese
Information bei künftigen Threads im Bereich Datenbanken gleich im ersten
Beitrag ein.
Freundliche Grüße
Vinzenz
Hi,
Ich wiederhole: welche *genaue* Serverversion?
Tut mir Leid. mySQL 5.0.15
Dein Versuch der "Normalisierung" scheint etwas schiefgegangen zu sein.
Wobei sich das dann besser beurteilen ließe, wenn Du ein paar Tabellen
inklusive ein paar Beispieldaten vorstellen würdest. Jedenfalls entgeht
mir die Notwendigkeit, bei Neuanlage eines Datensatzes gleich noch ein
paar weitere anzulegen. Ich vermute, dass es nicht erforderlich wäre.
Bsp:
Tabelle User
ID, Name, Mail, Geschlecht, Passwort, PLZ, Wohnort, Punkte, IP, Onlinestatus, SESSION, usw. (ca.30 Spalten die ich
Beispieleintrag:
123, Heinz, blabla@web.de, 2, abcde, 89050....
Damals war alles in der Tabelle User drin. Weil viele gemeint haben, das wären zu viele Spalten, habe ich das ganze aufgeteilt.
Tabelle Userprofil:
ID, Hobbies, Motto, IchMag, IchMagNicht, FavoriteLink, MitgliedSeit, ICQ, Sport, Sternzeichen... (ca. 30 Spalten - Diese Spalten waren früher noch in der Tabelle User drin)
Beim registrieren wollte ich nun in diese Tabelle den Zeile
123, , , Anlegen. Die Spalten blieben dann leer.
Zudem habe ich noch ein paar neue Tabellen angelegt, für die dasselbe gilt.
Tabelle USersingleanzeige
ID, IchSuche, Größe, Gewicht, Haarfarbe ... (ca. 20 Spalten)
Und ja, dafür könnte man auch einen INSERT-Trigger verwenden. Es gibt doch
Insert-Trigger. Das sagt mir jetzt garnichts, werde aber sicherlich schlau, wenn ich die Doku durchsuche oder google.
Grüße
Hallo,
Tut mir Leid. mySQL 5.0.15
danke für die Info.
Dein Versuch der "Normalisierung" scheint etwas schiefgegangen zu sein.
ja, Dein Versuch ist etwas schiefgegangen.
Tabelle User
ID, Name, Mail, Geschlecht, Passwort, PLZ, Wohnort, Punkte, IP, Onlinestatus, SESSION, usw. (ca.30 Spalten die ich
Beispieleintrag:
123, Heinz, blabla@web.de, 2, abcde, 89050....
Damals war alles in der Tabelle User drin. Weil viele gemeint haben, das wären zu viele Spalten, habe ich das ganze aufgeteilt.
Das ist ein miserables Argument. Wenn die Spalten erforderlich sind, dann
sind sie erforderlich.
Tabelle Userprofil:
ID, Hobbies, Motto, IchMag, IchMagNicht, FavoriteLink, MitgliedSeit, ICQ, Sport, Sternzeichen... (ca. 30 Spalten - Diese Spalten waren früher noch in der Tabelle User drin)
das tut weh. Das tut sehr weh. Dein Tabellendesign taugt wenig.
Beispiele:
Hobbies
IchMag
IchMagNicht
Sport
und Vergleichbares hat nichts, gar nichts, überhaupt gar nichts in dieser
Tabelle verloren. Das ist miserabelstes Tabellendesign.
Eine Person kann mehrere Hobbies haben, verschiedene Personen können das
gleich Hobby haben. Das ist eine typische n:m-Verknüpfung, für die Du die
Tabellen für
- Personen
- Hobbies
- die Zuordnung von Hobby zu Person
benötigst. Es ist eine ganz schlechte Idee, in solche Spalten kommagetrennte
Listen zu speichern. Ganz bestimmt willst Du doch überprüfen, wer ähnlich
Vorlieben und Abneigungen hat. Geht das mit Freitext oder kommagetrennten
Listen. Nur mit Aufwand. Mach' es also richtig.
Beim registrieren wollte ich nun in diese Tabelle den Zeile
123, , , Anlegen. Die Spalten blieben dann leer.
Verzichte solange auf einen Eintrag in der Tabelle, bis auch endlich Inhalt
dafür da ist.
Grundsätzlich solltest Du beim Datenbankdesign am besten von vorn anfangen.
Du hast eine ziemlich genaue Vorstellung, welche Daten Du speichern möchtest.
Versuche zu erkennen, welche Entitätstypen Du hast, welche Eigenschaften
diese Entitätstypen haben und wie die Beziehungen der Entitätstypen
untereinander sind (siehe oben Personen und Hobbies).
Aus dem Entity-Relationship-Modell, das Du erstellt hast, sollte sich Dein
Tabellendesign sehr leicht ableiten lassen :-)
Bitte denke daran, dass Fehler, die Du beim Tabellendesign machst, sich später
nur sehr schwer korrigieren lassen. Daher: Mach' es richtig!
Freundliche Grüße
Vinzenz
Hi,
Das ist ein miserables Argument. Wenn die Spalten erforderlich sind, dann
sind sie erforderlich.
Oki, dann habe ich das wohl falsch verstanden.
Das ist miserabelstes Tabellendesign.
Eine Person kann mehrere Hobbies haben, verschiedene Personen können das
gleich Hobby haben. Das ist eine typische n:m-Verknüpfung, für die Du die
Tabellen für
- Personen
- Hobbies
- die Zuordnung von Hobby zu Person
benötigst. Es ist eine ganz schlechte Idee, in solche Spalten kommagetrennte
Listen zu speichern. Ganz bestimmt willst Du doch überprüfen, wer ähnlich
Vorlieben und Abneigungen hat. Geht das mit Freitext oder kommagetrennten
Listen. Nur mit Aufwand. Mach' es also richtig.
Oki, mein Problem war, dass ich alle Eingaben als Freitext den Mitgliedern ermöglich habe.
Nach dem Schema könnte ich einige Punkte realisieren. Zwar net alles, da man einige dennoch als Freitext lassen muss.
Später beim Auslesen des Profils müsste ich dann mit einigen Tabellen Joinen, wenn ich das mit mehreren Punkte mache: Hobbies, Nationalität, Sprachen, Kinder, Familienstand, Beruf...
Ich fange dann mal gleich an, solch eine Struktur, wie von dir gerade vorgeschlagen, nachzugehen.
Was mir gerade so spontan einfällt.
Wenn ich später ein paar Daten in ein Array lade.
Bsp. Username, Hobbie und Nationalität.
Tabelle User:
userID 123
Name Heinz
Tabelle Hobbies
hobbyID 1
Hobbyname Fußball
hobbyID 2
Hobbyname Tennis
Tabelle Hobbiezuordnung
useridID 123
hobbyID 1
So ähnlich mit Nationalität:
Früher als alles in einer Tabelle drin war, hätte ich diese drei Angaben von der Tabelle "User" abgefragt.
String[] userarray="select name, hobby, nationalitaet from User where userID=123;";
Jetzt müsste ich einige Joins machen um auf die Daten zurückzugreifen. Ja gut, mit Joins komme ich einwenig zurecht.
Meine Befürchtung nun so spontan, was mache ich, wenn der User jetzt keinen Eintrag in der Tabelle "Hobbiezuordnung" hat.
Nach der alten Struktur hätte ich einen leeren Array[1], aber immer 3 Arrayfelder.
Beim Join jetzt, sobald kein Hobby eingetragen ist, habe ich nur noch 2 Arrayfelder. Username und Nationalität.
Nationalität hat sich verschoben und das dritte Arrayfeld wäre nicht da. Jetzt müsste ich mir mal überlegen, wie ich das ganze dann ausgebe. Vielleicht denke ich einfach gerade nur kompliziert ;)
Aus dem Entity-Relationship-Modell, das Du erstellt hast, sollte sich Dein
Tabellendesign sehr leicht ableiten lassen :-)Bitte denke daran, dass Fehler, die Du beim Tabellendesign machst, sich später
nur sehr schwer korrigieren lassen. Daher: Mach' es richtig!
Oki danke, ich werde mich darum bemühen und mich anstrengen ;)
Grüße
Hi,
Normalisieren heisst nicht Tabellen teilen.
Schau auf Wikipedia nach, da findest das wichtigste in Kuerze, bzw. google, und du findest genug.
1. Normalform is ja easy: Keine Tupel in einer Tabellenzelle, sprich sowas ist nicht erlaubt:
IchMag = "Mich, Dich, normalisierte Relationen"
Die ist mal Pflicht!
Und die 2. und 3. zu beruecksichtigen leg ich dir auch ans Herz.
Das ist eine Menge Aufwand, aber es wird noch mehr Aufwand wenn du dein Design so laesst wie es ist.
Viel Erfolg
Hi,
IchMag = "Mich, Dich, normalisierte Relationen"
Die ist mal Pflicht!
Und die 2. und 3. zu beruecksichtigen leg ich dir auch ans Herz.
Das ist eine Menge Aufwand, aber es wird noch mehr Aufwand wenn du dein Design so laesst wie es ist.
Ah ja. So meint man das mit der Normalform.
Danke für den Tipp, ich werde mich die Tage etwas schlau machen und die ganze Struktur überarbeiten. Meine Fragen dazu schreibe ich als Antwort auf Vinzenz's Eintrag.
Grüße