On 29/4/25 16:36, Laurenz Albe wrote:
On Tue, 2025-04-29 at 08:36 +1000, Tim Starling wrote:
My code would be like

function upsert( $table, $names, $values, $key, $set ) {
      if ( $this->type === 'mysql' ) {
          $conflict = 'ON DUPLICATE KEY UPDATE';
      } else {
          $conflict = "ON CONFLICT ($key) DO UPDATE SET";
      }
      return $this->query( "INSERT INTO $table ($names) " .
          "VALUES ($values) $conflict $set" );
}

The parameters are a little bit more structured than that, but that
gives you the idea.

Another litle "if" to cater for PostgreSQL's "EXCLUDED." would be
such a big problem?

I don't understand what you mean. EXCLUDED is not needed. "$table." needs to be prefixed to every column reference in the string $set. How do you find the column references amongst the string literals, function calls, etc.? You would need to parse the expression.

This is a public interface and there may be callers in code that I don't have access to.

Part of the reason for wanting to replace the existing emulation with a native upsert is to simplify the code. Parsing the expression is definitely not a simplification.

-- Tim Starling


Reply via email to