Chris Wesseling ([EMAIL PROTECTED]) reports a bug with a severity of 2 The lower the number the more severe it is.
Short Description UPDATE on column with UNIQUE constraint sometimes(!) fails. Long Description The result of an UPDATE changing a column with a uniqueness CONSTRAINT depends on the physical order of the rows (or tuple). I believe this is in contradiction with the relational model. example. Create a table "example" with a integer column "nr". And add a uniqueness constraint to it. Fill it with the values 1,2 and 3. Now if you want to increment those values by one, this should give you a table with values 2,3 and 4. (all values are unique). UPDATE example SET nr = nr+1; Fails with an error. Empty the table. And fill it with the values 3, 2, and 1. UPDATE example SET nr = nr+1; Now gives the expected result. The order 3,1,2 fails as well, leaving the table unchanged. Which at least is far far better, than what MySQL makes of it. (it updates untill can't update no more leaving you with a very unpredictable partially updated table! Luckily we have no dealings with MySQL's anomalies ;) Logically there is no difference between the 3 relations, yet the same query gives 2 different results. Sample Code chris=# SELECT version(); version ------------------------------------------------------------- PostgreSQL 7.3.2 on i686-pc-linux-gnu, compiled by GCC 2.96 (1 row) chris=# CREATE TABLE example (nr INTEGER UNIQUE); NOTICE: CREATE TABLE / UNIQUE will create implicit index 'example_nr_key' for table 'example' CREATE TABLE chris=# INSERT INTO example VALUES (1); INSERT 17011 1 chris=# INSERT INTO example VALUES (2); INSERT 17012 1 chris=# INSERT INTO example VALUES (3); INSERT 17013 1 chris=# SELECT * FROM example; nr ---- 1 2 3 (3 rows) chris=# UPDATE example SET nr = nr+1; ERROR: Cannot insert a duplicate key into unique index example_nr_key chris=# DELETE FROM example; DELETE 3 chris=# INSERT INTO example VALUES (3); INSERT 17014 1 chris=# INSERT INTO example VALUES (2); INSERT 17015 1 chris=# INSERT INTO example VALUES (1); INSERT 17016 1 chris=# SELECT * FROM example; nr ---- 3 2 1 (3 rows) chris=# UPDATE example SET nr = nr+1; UPDATE 3 chris=# SELECT * FROM example; nr ---- 4 3 2 (3 rows) chris=# No file was uploaded with this report ---------------------------(end of broadcast)--------------------------- TIP 5: Have you checked our extensive FAQ? http://www.postgresql.org/docs/faqs/FAQ.html