Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   INSERT in zwei Tabellen und UNIQUE-Index??? (https://www.delphipraxis.net/162928-insert-zwei-tabellen-und-unique-index.html)

romber 9. Sep 2011 16:40

Datenbank: MS SQL Server • Version: 2008 • Zugriff über: ADO oder UniDAC

INSERT in zwei Tabellen und UNIQUE-Index???
 
Es gibt als Beispiel zwei Tabellen: "Artikel" und "Anbieter". Tabelle "Artikel" ist mit der Tabelle "Anbieter" durch einen Foreign Key verknüpft. Mehrere Felder in der Tabelle "Anbieter" sind mit einem UNIQUE-Index verbunden, um doppelte einträge zu verhindern.

Wie ist jetzt der richtige Weg, den Tabellen einen neuen Datensatz hinzu zu fügen?

Union 9. Sep 2011 18:45

AW: INSERT in zwei Tabellen und UNIQUE-Index???
 
Na zuerst die Anbietertabelle mit allen benötigten Constraints und dann den Artikel mit Referenz auf den Anbieter.

romber 9. Sep 2011 19:46

AW: INSERT in zwei Tabellen und UNIQUE-Index???
 
Vielen Dank für die schnelle Reaktion!

Zitat:

Zitat von Union (Beitrag 1123034)
Na zuerst die Anbietertabelle mit allen benötigten Constraints und dann den Artikel mit Referenz auf den Anbieter.

Das ist soweit klar. Das Problem ist, dass es beim UNIQUE-Konflikt keine Referenz auf den bereits vorhandene Anbieter zurückkommt, sondern nur die Meldung, dass es halt den Konflikt gibt. Muss ich vorher jedesmal prüfen, ob der Anbieter bereits existiert oder gibt es eine elegantere und schnellere Methode?

Union 9. Sep 2011 20:59

AW: INSERT in zwei Tabellen und UNIQUE-Index???
 
Das ist ja eben elegant. Ein Post ist nicht möglich wenn etwas nicht stimmt, und es ist zentral in der Datenbank zentral hinterlegt. Du musst nur die Exception ggf. abfangen und dem User vermitteln.

romber 9. Sep 2011 21:10

AW: INSERT in zwei Tabellen und UNIQUE-Index???
 
Zitat:

Zitat von Union (Beitrag 1123046)
Du musst nur die Exception ggf. abfangen und dem User vermitteln.

Stimmt, wenn es um einen einzelnen Datensatz geht und der User die Exception haben möchte. Was aber, wenn es um bis zu 120 Datensätze pro Sekunde geht, die man über eine Datenschnittstelle übermittelt bekommt und "unbeaufsichtigt" in einer Schleife mittels Prepared Statements so schnell wie möglich der Datenbank hinzufügen soll? Dann ist die o.g. SELECT-Abfrage über die Anbieter-Tabelle ein gnadenloser Performance-Killer. Deswegen war ich gespannt, ob es noch eine schönere Methode gibt...

Edit: Natürlich muss man nicht zwingend vor jedem INSERT diese SELECT-Abfrage ausführen. Es würde reichen, wenn man die Exception abfängt und erst dann die Referenz auf den Anbieter holt. Aber im meinem bekomme ich die Daten immer von denselber Anbietern, so dass es nach gewisser Zeit praktisch jeder INSERT ein UNIQUE-Konflikt auslösen würde.

Union 9. Sep 2011 21:14

AW: INSERT in zwei Tabellen und UNIQUE-Index???
 
Ja wie sieht denn das CONSTRAINT Konstrukt aus - ist das wirklich so fies? Was sind die Feldtypen die geprüft werden? Und wie immer bei MSSQL kann man durch Schrauben mit Statistiken und Indexen sicher was erreichen. Übrigens hängt es auch davon ab bei welchem Feld es fehlschlägt, denn es kann ja ggf. mehrere Duplikate diesbezüglich geben.

Ansonsten steht der Key in der Exception:

CREATE UNIQUE INDEX terminated because a duplicate key was found. Most significant primary key is '%S_KEY'.
oder
Cannot insert duplicate key row in object '%.*ls' with unique index '%.*ls'.

romber 9. Sep 2011 21:24

AW: INSERT in zwei Tabellen und UNIQUE-Index???
 
Die Feldtypen sind fast alle vom Typ NVARCHAR. Ich musste dieses Typ nehmen, weil es sich bei vielen Anbieter um ausländische, meistens osteuropäische, Firmen handelt und die viele Firmennamen und personenbezogene Daten ganz oder Teilweise in Unicode bedürfen.

romber 9. Sep 2011 21:29

AW: INSERT in zwei Tabellen und UNIQUE-Index???
 
Zitat:

Zitat von Union (Beitrag 1123051)
Ansonsten steht der Key in der Exception:

CREATE UNIQUE INDEX terminated because a duplicate key was found. Most significant primary key is '%S_KEY'.
oder
Cannot insert duplicate key row in object '%.*ls' with unique index '%.*ls'.

Ich glaube, ich krieg jetzt die Kriese! Genau so einen Exception-Text möchte ich gerne haben, aber bei UniDAC habe ich das eben nicht! Ich habe nur die Meldung, dass ein Fehler aufgetretten ist. War das ADO? Ich dachte mir, die DB-Komponenten geben bei den Exception die genauen DB-Engine-Meldungen wieder, deswegen habe ich ADO nicht mal ausprobiert.

Union 9. Sep 2011 21:37

AW: INSERT in zwei Tabellen und UNIQUE-Index???
 
Nein, das sind die Meldungen vom SQL-Server. Die müssen ja irgendwie ankommen. Aber irgendwie scheint mir das Konstrukt der Plausibilisierung nicht überzeugend zu sein. Kannst Du nicht mit Anbieter-IDs arbeiten von vornherein? Und dann nur bei Neuanlage, Änderung die kompletten Daten in einer separaten EDI?

romber 9. Sep 2011 21:49

AW: INSERT in zwei Tabellen und UNIQUE-Index???
 
Zitat:

Zitat von Union (Beitrag 1123063)
Kannst Du nicht mit Anbieter-IDs arbeiten von vornherein? Und dann nur bei Neuanlage, Änderung die kompletten Daten in einer separaten EDI?

Das ist das Problem. Es gibt keine AnbieterID.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:53 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz