Skip to content

5.x: insertOrUpdate() #950

@dereuromark

Description

@dereuromark

Following insertOrSkip() of #942

INSERT ... ON DUPLICATE UPDATE

  • ✅ MySQL: Native support
  • ⚠️ PostgreSQL: Need to specify which column(s) cause the conflict
  • ⚠️ SQLite: Need to specify conflict column(s), requires 3.24.0+
  • ⚠️ SQL Server: Very complex MERGE syntax

Database Support Matrix

Feature MySQL/MariaDB PostgreSQL SQLite SQL Server
INSERT IGNORE ✅ Native ✅ Via ON CONFLICT DO NOTHING ✅ Via INSERT OR IGNORE ❌ No native support
INSERT ... ON DUPLICATE KEY UPDATE ✅ Native ✅ Via ON CONFLICT ... DO UPDATE ❌ Limited ⚠️ Via MERGE

We can still add insertOrUpdate() if people are interested in this.

  • Start with single-row upserts
  • Require explicit conflict columns for now (avoid auto-detection complexity)
  • Consider it a "power user" feature for data sync scenarios

For SQLite and SQLServer we might want to "shim" it using the old way internally, so it doesnt need to throw NotImplementedExceptions.
This would still gain performance for Mysql and Postgres.

What do you think?

Example future use:

// Seed with updates - sync from external API
$this->insertOrUpdate('currencies', [
    ['code' => 'USD', 'rate' => 1.0000, 'updated' => '2025-11-04'],
    ['code' => 'EUR', 'rate' => 0.9234, 'updated' => '2025-11-04'],
], ['rate', 'updated'], ['code']);  // Update rate+updated if code exists

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions