UPSERT in PostgreSQL mit PHP

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;
  }

UPSERT in PostgreSQL mit PHP weiterlesen

RedBeanPHP – Die einfach zu verwendende ORM-Bibliothek

RedBeanPHP ist eine einfach zu verwendende ORM-Bibliothek, die die Vorteile eines dokumentenorientierten Datenbanksystems wie z.B. mongoDB und eines relationalen Datenbanksystems vereint. RedBeanPHP kann direkt eingesetzt werden und erfordert keine aufwändige Konfiguration.

Anwendungsbeispiel:

//RedBeanPHP einbinden
require_once('rb.php');

//Datenbankverbindung einrichten
R::setup('mysql:host=localhost;dbname=test','root','password');

/*
Einen neuen Datensatz erzeugen
- Die Tabelle wird automatisch angelegt!
*/

$oEntry = R::dispense('mytable');
$oEntry->title = 'Hello World';

//Datensatz speichern
$iID = R::store($oEntry);

//Laden der gespeicherten Daten
$oEntry = R::load('mytable', $iID);

//Anzeigen des Titels
echo $oEntry->title;

Link: http://redbeanphp.com/
GitHub: https://github.com/gabordemooij/redbean

PGSQL: Duplikate in einer Tabelle finden

Das folgende SQL Statement ermittelt alle Duplikate in einer Tabelle. Vorraussetzung hierfür ist, dass sich die Spalte mit dem Primärschlüssel an erster Stelle befindet.

SELECT
    *
FROM
(  
  SELECT
  COUNT(substr(tmp.*::text, strpos(tmp.*::text, ','))) AS duplicate_count,
        substr(tmp.*::text, strpos(tmp.*::text, ',')) AS duplicate_entry
  FROM
      my_table AS tmp
  GROUP BY duplicate_entry
)
AS subquery
WHERE duplicate_count > 1
GROUP BY duplicate_count, duplicate_entry