DDC-668: add upsert support #826

Closed
opened 2026-01-22 12:51:50 +01:00 by admin · 7 comments
Owner

Originally created by @doctrinebot on GitHub (Jul 4, 2010).

Originally assigned to: @Majkl578 on GitHub.

Jira issue originally created by user @lsmith77:

Didnt find anything in the docs on this. Is D2 capable of doing an UPSERT [1] in case I am trying to persist an object that may or may not have been saved previously. Different RDBMS support different syntax for this case. Like MySQL has INSERT .. ON DUPLICATE KEY UPDATE (or even INSERT IGNORE) while the SQL standard defines a MERGE syntax which seems to be gaining support. Of course you can always fallback to a SELECT FOR UPDATE (or if you want to be hacky an INSERT which catches duplicate key violations .. but probably not a good idea since many RDBMS rollback on a failure inside a transaction).

[1] http://en.wikipedia.org/wiki/Upsert

See also http://opensource.atlassian.com/projects/hibernate/browse/HHH-3011 asking for MERGE support

Ideally there would be a way to define on a model or model instance level if merge logic should be applied.

Originally created by @doctrinebot on GitHub (Jul 4, 2010). Originally assigned to: @Majkl578 on GitHub. Jira issue originally created by user @lsmith77: Didnt find anything in the docs on this. Is D2 capable of doing an UPSERT [1] in case I am trying to persist an object that may or may not have been saved previously. Different RDBMS support different syntax for this case. Like MySQL has INSERT .. ON DUPLICATE KEY UPDATE (or even INSERT IGNORE) while the SQL standard defines a MERGE syntax which seems to be gaining support. Of course you can always fallback to a SELECT FOR UPDATE (or if you want to be hacky an INSERT which catches duplicate key violations .. but probably not a good idea since many RDBMS rollback on a failure inside a transaction). [1] http://en.wikipedia.org/wiki/Upsert See also http://opensource.atlassian.com/projects/hibernate/browse/HHH-3011 asking for MERGE support Ideally there would be a way to define on a model or model instance level if merge logic should be applied.
admin added the New FeatureInvalid labels 2026-01-22 12:51:50 +01:00
admin closed this issue 2026-01-22 12:51:51 +01:00
Author
Owner

@doctrinebot commented on GitHub (Jul 9, 2010):

Comment created by robertb:

Doctrine_Record defines a replace() method.

In the MySQL Doctrine implementation, however, it is not the same as INSERT .. ON DUPLICATE KEY UPDATE. The replace() method implemented in Doctrine_Connection_Mysql uses the REPLACE INTO syntax, which is a DELETE and then INSERT when the key exists. This is fine, except for tables that use auto-increment fields. The delete-then-insert operation yields a new auto-incremented value, whereas INSERT .. ON DUPLICTATE KEY UPDATE would not.

@doctrinebot commented on GitHub (Jul 9, 2010): Comment created by robertb: Doctrine_Record defines a replace() method. In the MySQL Doctrine implementation, however, it is not the same as INSERT .. ON DUPLICATE KEY UPDATE. The replace() method implemented in Doctrine_Connection_Mysql uses the REPLACE INTO syntax, which is a DELETE and then INSERT when the key exists. This is fine, except for tables that use auto-increment fields. The delete-then-insert operation yields a new auto-incremented value, whereas INSERT .. ON DUPLICTATE KEY UPDATE would not.
Author
Owner

@doctrinebot commented on GitHub (Jul 9, 2010):

Comment created by @lsmith77:

MySQL (and SQLite) REPLACE is a no go. It causes way too much disc I/O and worse yet totally screws up the on disk data structures because of the deleting.

@doctrinebot commented on GitHub (Jul 9, 2010): Comment created by @lsmith77: MySQL (and SQLite) REPLACE is a no go. It causes way too much disc I/O and worse yet totally screws up the on disk data structures because of the deleting.
Author
Owner

@doctrinebot commented on GitHub (Jul 31, 2011):

Comment created by @beberlei:

Scheduled for 2.2

@doctrinebot commented on GitHub (Jul 31, 2011): Comment created by @beberlei: Scheduled for 2.2
Author
Owner

@doctrinebot commented on GitHub (Jul 31, 2011):

Comment created by @beberlei:

Evaluating this makes me sad, except MySQL support for this is rather non-existant, and the oracle merge is aiming at batch operations.

@doctrinebot commented on GitHub (Jul 31, 2011): Comment created by @beberlei: Evaluating this makes me sad, except MySQL support for this is rather non-existant, and the oracle merge is aiming at batch operations.
Author
Owner

@doctrinebot commented on GitHub (Oct 22, 2011):

Comment created by @beberlei:

Should this be done with

  1. Select first, then insert
  2. Catch and evaluate exception then update

I am leaning towards 1.

@doctrinebot commented on GitHub (Oct 22, 2011): Comment created by @beberlei: Should this be done with 1. Select first, then insert 2. Catch and evaluate exception then update I am leaning towards 1.
Author
Owner

@doctrinebot commented on GitHub (Dec 20, 2011):

Comment created by @guilhermeblanco:

Updating fix version

@doctrinebot commented on GitHub (Dec 20, 2011): Comment created by @guilhermeblanco: Updating fix version
Author
Owner

@Majkl578 commented on GitHub (Dec 20, 2017):

Closing in favor of doctrine/dbal#2939, not an ORM issue by itself.

@Majkl578 commented on GitHub (Dec 20, 2017): Closing in favor of doctrine/dbal#2939, not an ORM issue by itself.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: doctrine/archived-orm#826