Moin,
ich versuche gerade meinen QueryBuilder auf PostgreSQL zu erweitern. Was ist der cleverste weg, das von MySQL bekannte ON DUPLICATE KEY UPDATE mit PostgreSQL zu realisieren?
Ein Beispiel:
Was soll das?
Ein so formuliertes Insert aktualisiert einen Datensatz, wenn dieser bereits existiert. "Existiert" heisst, wenn ein Primary-Key oder ein Unique-Key verhindern, dass die übergebenen Daten ein Insert auslösen. In dem Fall wird dann automatisch ein Update gefahren. Der Trick "id = LAST_INSERT_ID(id)," macht, dass ich nach einem Insert ODER nach einem Update immer auf die last-insert-id zugreifen kann. "a = VALUES(a)" heisst "nimm den übergebenen Wert".
Das oben aufgeführte Beispiel zeigt ein Massinsert. Hier wird vielleicht auffallen, dass das "id = LAST_INSERT_ID(id)" unsinnig ist. Richtig - das macht nur Sinn, wenn ich einzelne Datensätze einfüge.
Warum das alles überhaupt? Warum nicht einfach zu Fuß?
Weil dieses Statement tatsächlich viele Aufgaben übernimmt, für die man sonst mindestens 3 Queries bräuchte. Ich weiss beispielsweise nicht automatisch, was der Autoincrement-Schlüssel (der in anderen Datenbanken ggf anders heisst) ist.
Jedenfalls kann ich so mit sehr einfachen Mitteln ein Insertstatement erstellen:
(Wie) kann ich das obrige SQL-Beispiel mit ähnlichen Komfort auf PostgreSQL portieren?
ich versuche gerade meinen QueryBuilder auf PostgreSQL zu erweitern. Was ist der cleverste weg, das von MySQL bekannte ON DUPLICATE KEY UPDATE mit PostgreSQL zu realisieren?
Ein Beispiel:
PHP-Code:
INSERT INTO
table
(id, a, b, c, d, e, f, g, h, i, j)
SELECT
id, a, b, c, d, e, f, g, h, i, j
FROM
sometable st
ON DUPLICATE KEY UPDATE
id = LAST_INSERT_ID(id),
a = VALUES(a),
b = NOW(),
c = c + 1,
d = CONCAT(e, '-', f);
Ein so formuliertes Insert aktualisiert einen Datensatz, wenn dieser bereits existiert. "Existiert" heisst, wenn ein Primary-Key oder ein Unique-Key verhindern, dass die übergebenen Daten ein Insert auslösen. In dem Fall wird dann automatisch ein Update gefahren. Der Trick "id = LAST_INSERT_ID(id)," macht, dass ich nach einem Insert ODER nach einem Update immer auf die last-insert-id zugreifen kann. "a = VALUES(a)" heisst "nimm den übergebenen Wert".
Das oben aufgeführte Beispiel zeigt ein Massinsert. Hier wird vielleicht auffallen, dass das "id = LAST_INSERT_ID(id)" unsinnig ist. Richtig - das macht nur Sinn, wenn ich einzelne Datensätze einfüge.
Warum das alles überhaupt? Warum nicht einfach zu Fuß?
Weil dieses Statement tatsächlich viele Aufgaben übernimmt, für die man sonst mindestens 3 Queries bräuchte. Ich weiss beispielsweise nicht automatisch, was der Autoincrement-Schlüssel (der in anderen Datenbanken ggf anders heisst) ist.
Jedenfalls kann ich so mit sehr einfachen Mitteln ein Insertstatement erstellen:
PHP-Code:
$_POST = array(
'field1' => 123,
'field2' => '" SELECT 1 FROM',
'field3' => 'NOW()',
'field4' => 12345
);
$id = $builder->insert()
->into('table')
->setArray($_POST, ['field1', 'field2', 'field3'] /* mask */)
->setInsertOrUpdate('field4', 456)
->setUpdateRaw('last_update=NOW()')
->exec();
Kommentar