Re: SQL spec/implementation question: UPDATE
От | andy |
---|---|
Тема | Re: SQL spec/implementation question: UPDATE |
Дата | |
Msg-id | ffgi54$1f7e$1@news.hub.org обсуждение исходный текст |
Ответ на | SQL spec/implementation question: UPDATE (Kevin Hunter <hunteke@earlham.edu>) |
Ответы |
Re: SQL spec/implementation question: UPDATE
Re: SQL spec/implementation question: UPDATE |
Список | pgsql-general |
Kevin Hunter wrote: > Hullo list, > > A perhaps esoteric question: > > Short version: > > What do the specs say (if anything) about returning information from > UPDATE commands? Or about handling update request that don't > effectively do anything? > > Longer version: > > CREATE TABLE test ( > id SERIAL NOT NULL, > name TEXT NOT NULL, > passion TEXT NOT NULL, > > PRIMARY KEY( id ) > ); > > INSERT INTO test (name, passion) VALUES ('colin', 'contra-dancing'); > INSERT INTO test (name, passion) VALUES ('alex', 'contemplating'); > INSERT INTO test (name, passion) VALUES ('kevin', 'soccer'); > INSERT INTO test (name, passion) VALUES ('toby', 'biking'); > > BEGIN; > UPDATE test SET name = 'kevin' WHERE passion = 'soccer'; > Previous statement 5 times (or whatever) > COMMIT; > > Even though the last 5 statements effectively do nothing, every UPDATE > returns "UPDATE 1". If I do the same thing in MySQL, I get "Rows > matched: 1 Changed: 0 Warnings: 0". (I used the INNODB engine in MySQL.) > > In PHP, the {pg,mysql}_affected_rows functions return the same results: > 1 from Postgres and 0 from MySQL. > > So, two questions: which behavior is correct, or is it even defined? If > Postgres behavior is correct, why does it need to write to disk, (since > the tuple isn't actually changing in value)? > > Experience tells me that Postgres is probably doing the correct thing, > but it almost seems that it could be corner case, doesn't matter either > way, and is could be just a consequence of the MVCC guarantees, etc. > > TIA, > > Kevin I think your comparing apples and oranges. I'll bet that mysql is taking a shortcut and testing the value before updating it. The update is probably more close to: update test set name = 'kevin' where passion = 'soccer' and name <> 'kevin'; In this case, pg too, would only update once. -Andy
В списке pgsql-general по дате отправления: