(not the OP on idempotency)
On Sat, 8 Apr 2023 at 18:33, Louis Tian <[email protected]> wrote:
> > In general UPSERT (or any definition of it that I can think of) does
> > not imply idempotency.
> "Idempotence is the property of certain operations in mathematics and
> computer science whereby they can be applied multiple times without changing
> the result beyond the initial application." from Wikipedia.
> the concept of Idempotence when applies to HTTP is consistent with the above.
> https://developer.mozilla.org/en-US/docs/Glossary/Idempotent. Or are you
> going by a different defintion that I am not aware of?
> If you execute the same upsert multiple times, the state of the database
> remains the same as if only execute once.
> If a row already exists, the first statement will update the row so does any
> subsequent statements. executing the same update multiple time is the same as
> executing it only once.
> If the row doesn't exist, the first statement will insert that row and any
> subsequent will try to update, but the update has no real effect since it the
> value is exactly the same as the insert.
> So by defintion, upsert is idempotent.
Only on a narrow definition of upsert.
You are thinking on a narrow ( but very frequent ) use of "upsert"
statements, something like:
insert on users(id,name) values (1,'x') on conflict(id) update set name='x'
But upsert can be used for things like:
insert into last_access(id,cuando) values (1,current_timestamp) on
conflict(id) set cuando=current_timestamp
insert into access_count(id, access_count) values (1,1) on
conflict(id) set access_count=access_count+1
Which are not idempotent ( and also frequent, I use both variants )
Francisco Olarte.