Entwickler, der außergewöhnliche CRM- und Laravel-Lösungen liefert

Als erfahrener Entwickler spezialisiere ich mich auf Laravel- und Vue.js-Entwicklung, die Implementierung von Vtiger CRM sowie auf vielfältige WordPress-Projekte. Meine Arbeit zeichnet sich durch kreative, dynamische und benutzerzentrierte Weblösungen aus, die individuell an die Bedürfnisse meiner Kunden angepasst werden.

In diesem Artikel betrachten wir detailliert den Prozess des Dateneinfügens in PostgreSQL und zeigen, wie Sie Fehler vermeiden können, wenn doppelte Daten vorhanden sind. Alle Beispiele werden an einer Testdatenbank durchgeführt

PostgreSQL – Einfügen von Daten mit doppelten eindeutigen Feldern

In diesem Artikel betrachten wir detailliert den Prozess des Dateneinfügens in PostgreSQL und zeigen, wie Sie Fehler vermeiden können, wenn doppelte Daten vorhanden sind. Alle Beispiele werden an einer Testdatenbank durchgeführt – den Dump dieser Datenbank finden Sie unter:
https://www.postgresqltutorial.com/postgresql-sample-database/

  1. Einfache Dateneinfügung
    Der einfachste Weg, Daten in die Tabelle customer einzufügen, sieht folgendermaßen aus:   INSERT INTO customer (active, activebool, address_id, create_date, email, first_name, last_name, last_update, store_id)
      VALUES (1, default, 10, default, 'test2@test.com', 'Andrey', 'Vasilyev', default, 2);

Möchten Sie mehrere Datensätze in einem Schritt einfügen, verwenden Sie diesen Syntax:

  INSERT INTO customer (active, activebool, address_id, create_date, email, first_name, last_name, last_update, store_id)
  VALUES (1, default, 10, default, 'test2@test.com', 'Andrey', 'Vasilyev', default, 2),
       (1, default, 11, default, 'test4@test.com', 'Ivan', 'Ivanov', default, 2)
  RETURNING customer_id;

Beachten Sie den Zusatz RETURNING customer_id – dieser Ausdruck liefert nach dem Einfügen die IDs der neu erzeugten Datensätze zurück.

  1. Einrichten eines Unique-Constraints
    Um eindeutige Werte in einem Feld zu erzwingen, können Sie ein Unique-Constraint hinzufügen. Beispielsweise machen wir das Feld email in der Tabelle customer eindeutig:   
    ALTER TABLE customer ADD CONSTRAINT email_unique UNIQUE (email);

Nach dieser Änderung wird PostgreSQL verhindern, dass zwei Datensätze dieselbe E-Mail-Adresse enthalten.

  1. Fehler beim Einfügen doppelter Datensätze
    Versuchen Sie, einen Datensatz einzufügen, der bereits existiert (z. B. mit einer bekannten customer_id = 10), so könnte folgender Befehl verwendet werden:
      INSERT INTO customer (active, activebool, address_id, create_date, email, first_name, last_name, last_update, store_id)
      SELECT active, activebool, address_id, create_date, email, first_name, last_name, last_update, store_id
      FROM customer
      WHERE customer_id = 10
      RETURNING customer_id;

Da der ausgewählte Datensatz bereits eine E-Mail enthält, die im Unique-Constraint definiert ist, liefert diese Abfrage den Fehler:
  ERROR: duplicate key value violates unique constraint "email_unique"

  1. Vorabprüfung oder alternative Behandlung von Duplikaten
    Ein Lösungsansatz besteht darin, vor dem Einfügen zu prüfen, ob bereits ein Datensatz mit der betreffenden E-Mail existiert:   
    SELECT count(1) FROM customer WHERE email = 'test2@test.com';

Diese Methode ist allerdings etwas umständlich, denn es gibt eine elegantere Lösung.

  1. Nutzung von ON CONFLICT
    Der einfachste Weg, Konflikte beim Einfügen doppelter Daten zu vermeiden, besteht in der Verwendung der ON CONFLICT-Klausel:

a) Konflikt überspringen
Möchten Sie bei einem Konflikt einfach nichts tun, verwenden Sie:

  INSERT INTO customer (active, activebool, address_id, create_date, email, first_name, last_name, last_update, store_id)
  VALUES (1, default, 19, default, 'helen.harris@sakilacustomer.org', 'Helen', 'Harris', default, 1)
  ON CONFLICT DO NOTHING;

Dieser Befehl wirft keinen Fehler, selbst wenn bereits ein Datensatz mit der E-Mail „helen.harris@sakilacustomer.org“ existiert.

b) Datensatz aktualisieren
Angenommen, der Benutzer Helen zieht um und Sie möchten den vorhandenen Datensatz aktualisieren (z. B. neue Adresse, neuer Vor- und Nachname). Dann hilft folgender Befehl weiter:

  INSERT INTO customer (active, activebool, address_id, create_date, email, first_name, last_name, last_update, store_id)
  VALUES (1, default, 20, default, 'helen.harris@sakilacustomer.org', 'Helena', 'Harry', default, 1)
  ON CONFLICT (email) DO UPDATE
    SET first_name = EXCLUDED.first_name,
      last_name = EXCLUDED.last_name,
      address_id = EXCLUDED.address_id
  RETURNING customer_id;

Hier wird der Konflikt anhand des Feldes email erkannt. Das Schlüsselwort EXCLUDED verweist auf die neuen, im INSERT-Befehl angegebenen Werte. Bei einem Konflikt übernimmt PostgreSQL die neuen Werte für first_name, last_name und address_id und aktualisiert damit den bestehenden Datensatz. Mit RETURNING customer_id erhalten Sie abschließend die ID des betroffenen Kunden.

Fazit

Unter Verwendung der ON CONFLICT-Klausel können Sie in PostgreSQL Daten problemlos einfügen, ohne durch Duplicate-Key-Fehler behindert zu werden. Diese Methode bietet nicht nur eine elegante Fehlerbehandlung, sondern ermöglicht auch die Aktualisierung bestehender Datensätze, sollte sich etwa eine Information ändern. So bleiben Ihre Daten konsistent und die Einfügeoperationen effizient.