Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Einfügen wenn nicht vorhanden

203 views
Skip to first unread message

Marc Santhoff

unread,
Mar 15, 2016, 5:05:17 AM3/15/16
to
Tag allerseits,

ich bin mal wieder mit meinem Latein bzw. SQL am Ende:

Ziel ist, zwei Tabellen abzugleichen. Dabei ist eine womöglich geändert,
diese Änderungen sollen in die andere Übertragen werden.

Die Frage ist nun, kann man mittels SQL eine Abfrage formulieren, die
Einfügen eines Datensatzes mit einem bekannten Schlüssel nur dann
vornimmt, wenn dieser Schlüssel in der Zieltabelle noch nicht existiert?

Typischerweise würde man mit einer Programmiersprache eine Schleife
durchlaufen und die Schlüssel einzeln abfragen, das möchte ich wenn
möglich vermeiden.

TIA,
Marc

Claus Reibenstein

unread,
Mar 15, 2016, 5:13:29 AM3/15/16
to
Marc Santhoff schrieb am 15.03.2016 um 10:05:

> Die Frage ist nun, kann man mittels SQL eine Abfrage formulieren, die
> Einfügen eines Datensatzes mit einem bekannten Schlüssel nur dann
> vornimmt, wenn dieser Schlüssel in der Zieltabelle noch nicht existiert?

INSERT ... ON DUPLICATE KEY UPDATE ...

Gruß
Claus

Marc Santhoff

unread,
Mar 15, 2016, 5:16:06 AM3/15/16
to
Claus Reibenstein <4spame...@kabelmail.de> schrieb:
Sieht gut aus und erledigt beide Fälle, vielen Dank!

Marc

Lutz Donnerhacke

unread,
Mar 15, 2016, 5:38:35 PM3/15/16
to
* Marc Santhoff wrote:
> Die Frage ist nun, kann man mittels SQL eine Abfrage formulieren, die
> Einfügen eines Datensatzes mit einem bekannten Schlüssel nur dann
> vornimmt, wenn dieser Schlüssel in der Zieltabelle noch nicht existiert?

INSERT INTO ziel (id, x, y)
SELECT id, x, y
FROM quelle
WHERE id NOT IN (SELECT id FROM ziel);

Es kann sein, dass Folgendes schneller ist:
WHERE NOT EXISTS (SELECT 1 FROM ziel WHERE id = quelle.id)

Marc Santhoff

unread,
Mar 16, 2016, 3:44:49 AM3/16/16
to
Lutz Donnerhacke <lu...@iks-jena.de> schrieb:
Das schaut für mich relativ bekannt aus, danke sehr.

Die Formulierung von Claus konnte ich zumindest beim Suchen in der
PostgreSQL-Dokumentation so nicht ausfindig machen. Möglicherweise kein
Standard-SQL oder einfach in Postgres nicht iomplementiert. Oder ich
habe mich dumm angestellt... ;)

Marc

Claus Reibenstein

unread,
Mar 16, 2016, 4:13:48 AM3/16/16
to
Marc Santhoff schrieb am 16.03.2016 um 08:45:

> Die Formulierung von Claus konnte ich zumindest beim Suchen in der
> PostgreSQL-Dokumentation so nicht ausfindig machen.

Von PostgreSQL hattest Du nichts geschrieben. Eigentlich hast Du
überhaupt nichts über die verwendete Datenbankengine geschrieben.

> Möglicherweise kein Standard-SQL oder einfach in Postgres nicht
> iomplementiert.

Das ist wohl eine MySQL-Erweiterung. Zumindest deutet eine kurze
Google-Recherche darauf hin.

Gruß
Claus

Marc Santhoff

unread,
Mar 16, 2016, 4:17:42 AM3/16/16
to
Claus Reibenstein <4spame...@kabelmail.de> schrieb:

> Marc Santhoff schrieb am 16.03.2016 um 08:45:
>
> > Die Formulierung von Claus konnte ich zumindest beim Suchen in der
> > PostgreSQL-Dokumentation so nicht ausfindig machen.
>
> Von PostgreSQL hattest Du nichts geschrieben. Eigentlich hast Du
> überhaupt nichts über die verwendete Datenbankengine geschrieben.

Das war Absicht. Ich will bzw. darf mit dieser Anwendung nicht an eine
spezielle DB gebunden sein.

> > Möglicherweise kein Standard-SQL oder einfach in Postgres nicht
> > iomplementiert.
>
> Das ist wohl eine MySQL-Erweiterung. Zumindest deutet eine kurze
> Google-Recherche darauf hin.

OK, vielen Dank.

Marc

Harald Fuchs

unread,
Mar 16, 2016, 4:55:25 AM3/16/16
to
PostgreSQL 9.5 kann das auch, aber mit einer etwas anderen Syntax.

Lutz Donnerhacke

unread,
Mar 16, 2016, 6:46:41 AM3/16/16
to
Da ich die Syntax nicht kenne: Entspricht das dem Wunsch, die schon
vorhandenen Datensätze unangetastet zu lassen? Müßte es nicht vielmehr
INSERT ... ON DUPLICATE KEY IGNORE ...
heißen?

Claus Reibenstein

unread,
Mar 16, 2016, 7:01:51 AM3/16/16
to
Lutz Donnerhacke schrieb am 16.03.2016 um 11:46:

> * Claus Reibenstein wrote:
>
>> INSERT ... ON DUPLICATE KEY UPDATE ...
>
> Da ich die Syntax nicht kenne: Entspricht das dem Wunsch, die schon
> vorhandenen Datensätze unangetastet zu lassen? Müßte es nicht vielmehr
> INSERT ... ON DUPLICATE KEY IGNORE ...
> heißen?

Gibt es nicht und ist IMHO auch überflüssig: Wenn der Key bereits
existiert, wird der Datensatz sowieso nicht eingefügt, sondern es kommt
zu einem Fehler.

Gruß
Claus

Lutz Donnerhacke

unread,
Mar 16, 2016, 8:31:04 AM3/16/16
to
Fehler führen zu einem Abbruch der Transaktion und müssen vermieden werden.

Marc Santhoff

unread,
Mar 16, 2016, 8:48:00 AM3/16/16
to
Lutz Donnerhacke <lu...@iks-jena.de> schrieb:
Ganz klar: Jein. Es geht um eine Liste mit Adressen, die nur in einem
Exemplar ergänzt wird. Für Auswertungen brauche ich aber eine akutelle
Liste, damit die Schlüssel vorhanden sind.

Ein Update von geänderten Daten ist eigentlich nicht zwingend
erforderlich, aber wenn ich es im Vorbeigehen zusätzlich bekomme, nehme
ich es mit. Wer weiß, was in Zukunft mit der temporären Tabelle
passiert ...

Marc

Claus Reibenstein

unread,
Mar 16, 2016, 10:31:12 AM3/16/16
to
Wie wäre es dann mit INSERT IGNORE?

Gruß
Claus
0 new messages