AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken INSERT in zwei Tabellen und UNIQUE-Index???
Thema durchsuchen
Ansicht
Themen-Optionen

INSERT in zwei Tabellen und UNIQUE-Index???

Ein Thema von romber · begonnen am 9. Sep 2011 · letzter Beitrag vom 10. Sep 2011
Antwort Antwort
Seite 1 von 2  1 2      
romber

Registriert seit: 15. Apr 2004
Ort: Köln
1.166 Beiträge
 
Delphi 10 Seattle Professional
 
#1

INSERT in zwei Tabellen und UNIQUE-Index???

  Alt 9. Sep 2011, 17:40
Datenbank: MS SQL Server • Version: 2008 • Zugriff über: ADO oder UniDAC
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?
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#2

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

  Alt 9. Sep 2011, 19:45
Na zuerst die Anbietertabelle mit allen benötigten Constraints und dann den Artikel mit Referenz auf den Anbieter.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
romber

Registriert seit: 15. Apr 2004
Ort: Köln
1.166 Beiträge
 
Delphi 10 Seattle Professional
 
#3

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

  Alt 9. Sep 2011, 20:46
Vielen Dank für die schnelle Reaktion!

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?
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#4

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

  Alt 9. Sep 2011, 21:59
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.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
romber

Registriert seit: 15. Apr 2004
Ort: Köln
1.166 Beiträge
 
Delphi 10 Seattle Professional
 
#5

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

  Alt 9. Sep 2011, 22:10
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.

Geändert von romber ( 9. Sep 2011 um 22:15 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#6

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

  Alt 9. Sep 2011, 22:14
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'.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all

Geändert von Union ( 9. Sep 2011 um 22:20 Uhr)
  Mit Zitat antworten Zitat
romber

Registriert seit: 15. Apr 2004
Ort: Köln
1.166 Beiträge
 
Delphi 10 Seattle Professional
 
#7

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

  Alt 9. Sep 2011, 22:24
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.
  Mit Zitat antworten Zitat
romber

Registriert seit: 15. Apr 2004
Ort: Köln
1.166 Beiträge
 
Delphi 10 Seattle Professional
 
#8

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

  Alt 9. Sep 2011, 22:29
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.
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#9

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

  Alt 9. Sep 2011, 22:37
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?
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
romber

Registriert seit: 15. Apr 2004
Ort: Köln
1.166 Beiträge
 
Delphi 10 Seattle Professional
 
#10

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

  Alt 9. Sep 2011, 22:49
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:59 Uhr.
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