Diese kleine Methode erzeugt SQL-Queries (postgres) zum Erstellen oder Bearbeiten von Datensätzen. Als Parameter werden die Datensätze, die betreffende Tabelle und die Spalte mit dem Primärschlüssel übergeben.
Code:
function getUpsertSQL($aRows, $sTable, $sIDField)
{
$sSQL = "";
foreach( (array) $aRows as $aRow)
{
$sUpdate = "";
$sWhere = " WHERE ".$sIDField."=".$aRow[$sIDField];
foreach( (array) $aRow as $sColumnName => $mColumnValue)
{
if($sColumnName == $sIDField) continue;
$sColumn = $sColumnName." = ".$mColumnValue;
$sUpdate.= (empty($sUpdate) ? " SET ".$sColumn : ", ".$sColumn);
}
unset($aRow[$sIDField]);
$sSQL.= "UPDATE ".$sTable.$sUpdate.$sWhere.";";
$sSQL.= "INSERT INTO ".$sTable."(".implode(",",array_keys($aRow)).") ";
$sSQL.= "SELECT ".implode(", ", array_values($aRow))." ";
$sSQL.= "WHERE NOT EXISTS (SELECT 1 FROM ".$sTable." ".$sWhere.");";
}
return $sSQL;
}
{
$sSQL = "";
foreach( (array) $aRows as $aRow)
{
$sUpdate = "";
$sWhere = " WHERE ".$sIDField."=".$aRow[$sIDField];
foreach( (array) $aRow as $sColumnName => $mColumnValue)
{
if($sColumnName == $sIDField) continue;
$sColumn = $sColumnName." = ".$mColumnValue;
$sUpdate.= (empty($sUpdate) ? " SET ".$sColumn : ", ".$sColumn);
}
unset($aRow[$sIDField]);
$sSQL.= "UPDATE ".$sTable.$sUpdate.$sWhere.";";
$sSQL.= "INSERT INTO ".$sTable."(".implode(",",array_keys($aRow)).") ";
$sSQL.= "SELECT ".implode(", ", array_values($aRow))." ";
$sSQL.= "WHERE NOT EXISTS (SELECT 1 FROM ".$sTable." ".$sWhere.");";
}
return $sSQL;
}
Anwendungsbeispiel (Erstellen):
$aUsers = array();
$aUsers[] = array("id" => -1, "firstname" => "'Max'", "lastname" => "'Mustermann'", "email" => "'max@mustermann.de'", "description" => "'Das ist ein Test!'");
$aUsers[] = array("id" => -1, "firstname" => "'Erika'", "lastname" => "'Musterfrau'", "email" => "'erika@musterfrau.de'");
$aUsers[] = array("id" => -1, "firstname" => "'Karl'", "lastname" => "'Aschnikow'", "email" => "'karl@aschnikow.de'", "description" => "'Noch ein Test!'");
pg_exec($rConnection, getUpsertSQL($aUsers, "users", "id"));
/*
Erzeugtes SQL:
UPDATE users SET firstname = 'Max', lastname = 'Mustermann', email = 'max@mustermann.de', description = 'Das ist ein Test!' WHERE id=-1;
INSERT INTO users(firstname,lastname,email,description) SELECT 'Max', 'Mustermann', 'max@mustermann.de', 'Das ist ein Test!' WHERE NOT EXISTS (SELECT 1 FROM users WHERE id=-1);
UPDATE users SET firstname = 'Erika', lastname = 'Musterfrau', email = 'erika@musterfrau.de' WHERE id=-1;
INSERT INTO users(firstname,lastname,email) SELECT 'Erika', 'Musterfrau', 'erika@musterfrau.de' WHERE NOT EXISTS (SELECT 1 FROM users WHERE id=-1);
UPDATE users SET firstname = 'Karl', lastname = 'Aschnikow', email = 'karl@aschnikow.de', description = 'Noch ein Test!' WHERE id=-1;
INSERT INTO users(firstname,lastname,email,description) SELECT 'Karl', 'Aschnikow', 'karl@aschnikow.de', 'Noch ein Test!' WHERE NOT EXISTS (SELECT 1 FROM users WHERE id=-1);
*/
$aUsers[] = array("id" => -1, "firstname" => "'Max'", "lastname" => "'Mustermann'", "email" => "'max@mustermann.de'", "description" => "'Das ist ein Test!'");
$aUsers[] = array("id" => -1, "firstname" => "'Erika'", "lastname" => "'Musterfrau'", "email" => "'erika@musterfrau.de'");
$aUsers[] = array("id" => -1, "firstname" => "'Karl'", "lastname" => "'Aschnikow'", "email" => "'karl@aschnikow.de'", "description" => "'Noch ein Test!'");
pg_exec($rConnection, getUpsertSQL($aUsers, "users", "id"));
/*
Erzeugtes SQL:
UPDATE users SET firstname = 'Max', lastname = 'Mustermann', email = 'max@mustermann.de', description = 'Das ist ein Test!' WHERE id=-1;
INSERT INTO users(firstname,lastname,email,description) SELECT 'Max', 'Mustermann', 'max@mustermann.de', 'Das ist ein Test!' WHERE NOT EXISTS (SELECT 1 FROM users WHERE id=-1);
UPDATE users SET firstname = 'Erika', lastname = 'Musterfrau', email = 'erika@musterfrau.de' WHERE id=-1;
INSERT INTO users(firstname,lastname,email) SELECT 'Erika', 'Musterfrau', 'erika@musterfrau.de' WHERE NOT EXISTS (SELECT 1 FROM users WHERE id=-1);
UPDATE users SET firstname = 'Karl', lastname = 'Aschnikow', email = 'karl@aschnikow.de', description = 'Noch ein Test!' WHERE id=-1;
INSERT INTO users(firstname,lastname,email,description) SELECT 'Karl', 'Aschnikow', 'karl@aschnikow.de', 'Noch ein Test!' WHERE NOT EXISTS (SELECT 1 FROM users WHERE id=-1);
*/
Anwendungsbeispiel (Bearbeiten):
$aUsers = array();
$aUsers[] = array("id" => 24, "firstname" => "'Max'", "lastname" => "'Mustermann'", "email" => "'max@mustermann.de'", "description" => "'Beschreibung wurde geändert!'");
$aUsers[] = array("id" => 25, "firstname" => "'Erika'", "lastname" => "'Mustermann'", "email" => "'erika@mustermann.de'");
$aUsers[] = array("id" => 26, "firstname" => "'Karl'", "lastname" => "'Aschnikow'", "email" => "'neue-email@aschnikow.de'", "description" => "'Noch eine Teständerung!'");
pg_exec($rConnection, getUpsertSQL($aUsers, "users", "id"));
/*
Erzeugtes SQL:
UPDATE users SET firstname = 'Max', lastname = 'Mustermann', email = 'max@mustermann.de', description = 'Beschreibung wurde geändert!' WHERE id=24;
INSERT INTO users(firstname,lastname,email,description) SELECT 'Max', 'Mustermann', 'max@mustermann.de', 'Beschreibung wurde geändert!' WHERE NOT EXISTS (SELECT 1 FROM users WHERE id=24);
UPDATE users SET firstname = 'Erika', lastname = 'Mustermann', email = 'erika@mustermann.de' WHERE id=25;
NSERT INTO users(firstname,lastname,email) SELECT 'Erika', 'Mustermann', 'erika@mustermann.de' WHERE NOT EXISTS (SELECT 1 FROM users WHERE id=25);
UPDATE users SET firstname = 'Karl', lastname = 'Aschnikow', email = 'neue-email@aschnikow.de', description = 'Noch eine Teständerung!' WHERE id=26;
INSERT INTO users(firstname,lastname,email,description) SELECT 'Karl', 'Aschnikow', 'neue-email@aschnikow.de', 'Noch eine Teständerung!' WHERE NOT EXISTS (SELECT 1 FROM users WHERE id=26);
*/
$aUsers[] = array("id" => 24, "firstname" => "'Max'", "lastname" => "'Mustermann'", "email" => "'max@mustermann.de'", "description" => "'Beschreibung wurde geändert!'");
$aUsers[] = array("id" => 25, "firstname" => "'Erika'", "lastname" => "'Mustermann'", "email" => "'erika@mustermann.de'");
$aUsers[] = array("id" => 26, "firstname" => "'Karl'", "lastname" => "'Aschnikow'", "email" => "'neue-email@aschnikow.de'", "description" => "'Noch eine Teständerung!'");
pg_exec($rConnection, getUpsertSQL($aUsers, "users", "id"));
/*
Erzeugtes SQL:
UPDATE users SET firstname = 'Max', lastname = 'Mustermann', email = 'max@mustermann.de', description = 'Beschreibung wurde geändert!' WHERE id=24;
INSERT INTO users(firstname,lastname,email,description) SELECT 'Max', 'Mustermann', 'max@mustermann.de', 'Beschreibung wurde geändert!' WHERE NOT EXISTS (SELECT 1 FROM users WHERE id=24);
UPDATE users SET firstname = 'Erika', lastname = 'Mustermann', email = 'erika@mustermann.de' WHERE id=25;
NSERT INTO users(firstname,lastname,email) SELECT 'Erika', 'Mustermann', 'erika@mustermann.de' WHERE NOT EXISTS (SELECT 1 FROM users WHERE id=25);
UPDATE users SET firstname = 'Karl', lastname = 'Aschnikow', email = 'neue-email@aschnikow.de', description = 'Noch eine Teständerung!' WHERE id=26;
INSERT INTO users(firstname,lastname,email,description) SELECT 'Karl', 'Aschnikow', 'neue-email@aschnikow.de', 'Noch eine Teständerung!' WHERE NOT EXISTS (SELECT 1 FROM users WHERE id=26);
*/