Entwickler-Ecke

Datenbanken (inkl. ADO.NET) - INSERT Statement über mehrere Tabellen realisieren


Kossy - So 15.04.12 14:12
Titel: INSERT Statement über mehrere Tabellen realisieren
Hallo zusammen !

Kann mir vieleicht jemand von euch sagen, wie es möglich ist, mithilfe eines SQL INSERT Befehles gleichzeitig mehrere Tabellen zu befüllen, in denen evtl. auch Fremd- und Primärschlüsselabhängigkeiten (evtl. sogar mit Auto-Inkrementwerten) bestehen?

Also wenn ich als Benutzer innerhlab einer GUI ein Formular ausfülle und dann meine dort eingetragenen Werte gleichzeit gauf mehrere relevanten Tabellen verteilt und eingetragen werden?

Wie genau muss ein solches INSERT formuliert werden, evtl. mit einem INNER JOIN? Oder müssen einzelne Statements in der richtigen Reihenfolge realisiert werden?

Viele Grüße
--Kossy--


Regan - So 15.04.12 14:41

Hallo,

das widerspricht mehreren Prinzipien der Datenhaltung. Daten sollten zum Beispiel nur einmal gespeichert werden. Du solltest vorher deine Datenbank normalisieren [http://de.wikipedia.org/wiki/Normalisierung_(Datenbank)].

Viele Grüße
Regan


Kossy - So 15.04.12 15:57

Hallo !

Die Datenbank ist bereits normalisiert. Es geht darum über eine GUI Werte zu erfassen, die im Hintergrund über einen INSERT Befehl in die entsprechend normalisierten Tabellen eingetragen werdne und hier ist eben die Frage, wie ein solches /solche INSERT Statements aussehen?

--Kossy--


Ralf Jansen - So 15.04.12 16:00

Es gibt nicht den einen Insert. Vorgang ist Transaktion öffnen, n*Insert in der richtigen Reihenfolge absetzen, Transaktion schließen.


Kossy - Mo 16.04.12 08:12

Hallo Ralf !

"Vorgang ist Transaktion öffnen, n*Insert in der richtigen Reihenfolge absetzen, Transaktion schließen."

Aber wie genau berücksichtige ich den mögliche Autoinkrementwerte (evtl. auch in einer n:m Beziehung, die mit einer Tabelle abgebildet wird)?

Viele Grüße
--Kossy--


Ralf Jansen - Mo 16.04.12 08:27

Indem du zu jedem Insert im selben Batch ein 'SELECT SCOPE_IDENTITY()' absetzt.


Kossy - Mo 16.04.12 08:31

Hallo Ralf !

Könntest Du vielleicht ein ausführliches Beispiel aufführen, ich glaube dann wird mir das etwas klarer. Hab vielen Dank !

Viele Grüße
--Kossy--


Ralf Jansen - Mo 16.04.12 08:37

Allgemein siehe Retrieving Identity or Autonumber Values [http://msdn.microsoft.com/en-us/library/ks9f57t0.aspx]

Ansonsten wissen wir nix über deine Umgebung/benutzte Technik und können somit nicht konkret helfen.


Kossy - Di 17.04.12 07:58

Hallo Ralf !

Ich nutze den MS SQL Server 2008 R2 und verwenden ausschließlich SQL (kein TSQL). Meine Datenbank sieht eigentlich so aus:

Tabellen:
Mitarbeiter, Projekt, Abteilung (jede Tabelle besitzt einen Primärschlüssel als Autoinkrementwert)


1. Zwischen den Tabellen Mitarbeiter und Projekt besteht eine n:m Beziehung, d.h. zwiwschen diesen beiden Tabellen existiert eine Mappingtabelle, die diese n:m Beziehung quasi abbildet.

2. Zwischen den Tabellen Mitarbeiter und Abteilung besteht eine n:1 Beziehung.


Nun stellt sich die Frage, welchen Tabelle ich mit welchem Datensatz mit einem INSERT Statement zuerst befüllen muss?
Muss ich mich hier um Autoinkrementwerte gar nicht kümmern?

Viele Grüße
--Kossy--


Ralf Jansen - Di 17.04.12 08:41

Kommt drauf an welche Anwendungsfälle du umsetzen willst. Ungesehen sehe ich da jetzt eigentlich keinen Anwendungsfall in dem Mitarbeiter, Projekte oder Abteilungen in einem Rutsch gemeinsam angelegt werden müssen. Dann ist die Autoincrement Problematik weniger relevant. Du hast aber immer noch nix zur verwendeten Technik gesagt. Die Aussage SQL hilft uns nicht. Geht es um Entity Framework, LINQ to SQL, klassisches ADO mit DBCommands oder DataAdaptern oder TableAdaptern oder .....


Kossy - Di 17.04.12 09:33

Hallo Ralf !

ich nutze ADO.NET !

Viele Grüße
--Kossy--