Einfügen von Daten in SQL-Tabelle mit Primärschlüssel. Für Betrogenen - Einsatz Fehler erlauben oder Wählen Sie zuerst?

StackOverflow https://stackoverflow.com/questions/411575

  •  03-07-2019
  •  | 
  •  

Frage

Bei einer Tabelle wie:

CREATE TABLE dbo.MyTestData (testdata varchar(50) NOT NULL) 

ALTER TABLE dbo.MyTestData WITH NOCHECK ADD CONSTRAINT [PK_MyTestData] PRIMARY KEY  CLUSTERED (testdata) 

Und da wir eine einzigartige Liste der ‚Testdaten‘ wollen, wenn wir Einzelteile fertig sind das Sammeln aus einer Liste von externen Daten mit bekannten Duplikaten ... hinzugefügt werden, wenn ein Insert gespeicherte Prozedur durchführen soll das Verfahren geschrieben werden, um zu testen, Existenz oder sollte es für Fehler erlauben nur? Was ist die am weitesten verbreitete Praxis? Ich habe ausgeführt immer den Test auf die Existenz wurde aber diese letzte Nacht diskutieren ...

CREATE PROCEDURE dbo.dmsInsertTestData @ptestdata VarChar(50)
AS
  SET NOCOUNT ON

  IF NOT EXISTS(SELECT testdata FROM dbo.MyTestData WHERE testdata=@ptestdata)
  BEGIN
    INSERT INTO dbo.MyTestData (testdata ) VALUES (@ptestdata)
  END

RETURN 0

oder nur erfassen / PK Verletzung Fehler ignorieren, wenn diese eine Ausführung?

CREATE PROCEDURE dbo.dmsInsertTestData @ptestdata VarChar(50)
AS
  SET NOCOUNT ON
  INSERT INTO dbo.MyTestData (testdata ) VALUES (@ptestdata)
RETURN 0
War es hilfreich?

Lösung

Ich mache es immer in einer Erklärung:

INSERT INTO dbo.MyTestData (testdata ) VALUES (@ptestdata)
WHERE NOT EXISTS(SELECT 1 FROM dbo.MyTestData WHERE testdata=@ptestdata)

Andere Tipps

Ihre Prüfung auf Fehler (zB „IF NOT EXISTS ...“) kann oder nicht arbeiten kann, weil es eine mögliche Race-Bedingung ist (falls eine andere Transaktion den Datensatz einfügt nach dem IF NOT EXISTS-Anweisung aber vor Ihrer INSERT-Anweisung).

Deshalb, ob Sie prüfen, bevor, Sie sollten Ihre INSERT-Anweisung codieren, als ob es scheitern könnte.

Ob Sie überprüfen, wie gut (nicht statt) ist bis zu Ihnen und bis zu Ihrer Benutzeroberfläche.

Ich denke, die meisten Programmierer würde vorschlagen, die Ausnahme zu vermeiden. Ich bin aus anwendungstechnischer Sicht in T-SQL nicht sicher, aber in .NET zum Beispiel, glaube ich, eine ausgelöste Ausnahme teurer ist als eine zusätzliche if / else-Anweisung.

Meine Sorge mit dem ersten Beispiel hat Ihnen ist, dass es nicht einen Fehler an den Benutzer zurückkehrt. Es kann festgelegt werden, dies zu tun, aber ich würde es nicht verwenden, es sei denn, es wurde einen Fehler zurück.

Wenn Ihr Anliegen zwischen den beiden possibilties Leistung bei großen Tabellen ist, schlage ich vor, Sie testen, beide von ihnen und sehen, ob man deutlich schneller als der andere ist. Wenn das, wenn select besonders kompliziert ist und der Einsatz wird bei weitem die Mehrheit der Zeit passieren müssen, ist es möglich, dass einfach zu lassen, es wäre schneller versagen die meiste Zeit. Wenn onthe dagegen die Möglichkeit eines schlechten Eingang hoch ist und die, wenn relativ unkompliziert wie hier gezeigt, dann könnte der andere Prozess ein besseren sein. Aber nur echte Prüfung auf Ihrer reale Datenstruktur und Daten und mit Ihren wirklichen Abfragen können Ihnen sagen, welche die bessere ist für die Leistung, da sie kann in deiffernt situaltions Differnt werden.

Ich glaube, es auf die Art der gespeicherten Prozedur abhängt. Grundsätzlich sollten Sie Fehler behandeln, wenn Sie etwas mit ihnen zu tun haben (oder sie für die Kunden des Verfahrens zu kapseln) und lassen sie propagieren, wenn Sie nichts mit ihnen zu tun haben und kann nicht machen es freundlicher für andere Schichten der Anwendung.

Wenn die gespeicherte Prozedur ausgeführt ist Rohdaten einzufügen, ich denke, es sollte die Anwendung verlassen, die möglichen Fehler zu behandeln. Wenn die gespeicherte Prozedur wird als eine Abstraktionsschicht entwickelt (und hat eine spezifische Aufgabe im Gegensatz zu einem bestimmten Laufe Aussage ) und kann entweder den Fehler behandeln und mit ihm etwas zu tun oder es in einer anmutigen Weise berichten können (zum Beispiel gut definierte Fehlercodes) zur Anwendung, sollte es tun. Ansonsten sollte es bis zu der Anwendung sein, um sicherzustellen, es keine doppelten Daten ist das Einfügen, nicht auf die Datenbank (die Datenbank bereits diese mit Primärschlüssel erzwungen).

Um benutzerfreundlich zu sein, ist es oft eine gute Praxis, die SELECT auszuführen, und wenn der Datensatz bereits vorhanden ist, bieten dem Anwender die Möglichkeit zu betrachten und / oder bearbeiten.

Zum Beispiel, wenn ein Benutzer einen neuen Kundendatensatz hinzugefügt, könnten sie wollen die Informationen überprüfen, die bereits für diesen Kunden angezeigt wurde. Sie könnten zusätzliche Informationen auf den Datensatz, wie zum Beispiel einer Telefonnummer hinzuzufügen.

Bei dieser Art von Szenario, den Datensatz hinzufügen Verweigerung ist weniger nützlich als die Fähigkeit bietet die bestehende doppelte anzuzeigen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top