Insert nach Normalisierung

Klamauck

Neuer Benutzer
Beiträge
2
Hallo zusammen,

ich habe mich schon durch unzählige Tutorials gearbeitet, doch leider habe ich noch keine akzeptable Lösung für das Hinzufügen eines neuen Datensatzes in einer normalisierten Tabellenstruktur gefunden.

Erklärung:
In einer nicht normalisierten Tabelle (oberste AdressenTabelle) ist der "insert" kein Problem. Mit nur einem Befehl ist alles erledigt.

Doch wie geht man am besten vor, wenn zum Beispiel die Spalte Ort in eine separate Tabelle ausgelagert wurde?
Mein Problem ist immer die Zuordnung im Fremdschlüssel (hier gelb markiert) oder in dem Fall, dass ein neuer Ort hinzukommt, der noch nicht in der OrtTabelle existiert.

Muss man das dann in X Schritten abhandeln, wie:

1. Prüfen ob OrtTabelle z.B. ein Musterdorf enthält
2. Wenn nein => insert into OrtTabelle(Ort) values ('Musterdorf')
3. ID von Musterdorf abfragen und in einer Variable speichern
4. => insert into AdressenTabelle(Name, Straße, PLZ, Ort) values ('Anna Mustermann', 'Muster-Str. 2',83282, @variable)

Bei sehr vielen Tabellen wird das schnell unübersichtlich und fehleranfällig. Hierfür gibt es doch bestimmt einen besseren Weg?

tabelle.png

Danke schon mal im Voraus.

Gruß
Klamauck
 
Werbung:
Muss man das dann in X Schritten abhandeln, wie:

1. Prüfen ob OrtTabelle z.B. ein Musterdorf enthält
2. Wenn nein => insert into OrtTabelle(Ort) values ('Musterdorf')
3. ID von Musterdorf abfragen und in einer Variable speichern
4. => insert into AdressenTabelle(Name, Straße, PLZ, Ort) values ('Anna Mustermann', 'Muster-Str. 2',83282, @variable)

So wird es aber gemacht. Manche Systeme vereinfachen das, z.B. PostgreSQL mit seinen writeable Common Table Expressions. Aber im Kern läuft es so ab.
 
Ich könnte mir da eine Art Trigger-Kaskade vorstellen.
Jeder Trigger prüft für seine Tabelle die FKs und wenn nicht gibt er das dann mit einem Insert an die nächste Tabelle weiter... Keine Ahnung inwiefern das praktikabel ist... In Oracle nutze ich dafür immer Methoden :)
Eine Funktion "newAddresse" die versucht einen neuen Datensatz anzulegen und dafür die Funktion "check_insertOrt"(Parameter: Stadtname) aufruft. Diese wiederum gibt entweder die neu angelegte ID oder die bereits bestehende ID zurück.
Funktioniert soweit ganz gut :)
 
Danke für die Antworten.

Um den Client Code nicht unnötig aufzublähen werden ich das ganze in einer Prozedur ablegen. Das ähnelt ja einer Funktion :). Habe dazu das folgende Beispiel gefunden. http://sqlmag.com/t-sql/t-sql-101-stored-procedures


-- Listing 1: The InsertEmployee Stored Procedure

IF (object_id('InsertEmployee')) is NOT NULL
DROP PROCEDURE InsertEmployee
GO

-- BEGIN CALLOUT A
CREATE PROCEDURE InsertEmployee
(
@FirstName varchar(15),
@LastName varchar(15),
@Salary int,
@HireDate datetime
)
-- END CALLOUT A
AS

-- Section 1: Define and initialize the local variable.
DECLARE @count int
SELECT @count = 0

-- Section 2: Determine whether the record already exists.
SELECT @count = COUNT(*)
FROM Employee
WHERE FirstName = @FirstName
AND LastName = @LastName

-- Section 3: Insert the record if it doesn't already exist.
IF (@count = 0)
BEGIN
INSERT INTO Employee VALUES
(@FirstName, @LastName, @Salary, @HireDate)
PRINT 'Employee record inserted'
END
ELSE
PRINT 'Employee record already exists...'

GO
 
Werbung:
Zurück
Oben