> 2011/10/18 Robert Haas <robertmh...@gmail.com> > >> On Mon, Oct 17, 2011 at 7:30 PM, desmodemone <desmodem...@gmail.com> >> wrote: >> > Seems an Oracle bug not Postgresql one! >> >> I don't think it's a bug for it to work. It'd probably work in >> PostgreSQL too, if you inserted (2) first and then (1). It's just >> that, as Tom says, if you want it to be certain to work (rather than >> depending on the order in which the rows are inserted), you need the >> checks to be deferred. >> >> -- >> Robert Haas >> EnterpriseDB: http://www.enterprisedb.com >> The Enterprise PostgreSQL Company >> >
> 2011/10/18 desmodemone <desmodem...@gmail.com> > Hi there, > I could workaround the behavior with deferred constraint, and > it's ok, but as I show, I have different behavior for constraint with the > same definition in two rdbms and Postgresql depends on the physical order of > row (with the same definition of constraint NOT DEFERRABLE INITIALLY > IMMEDIATE) , or better Postgresql seems to check for every row, even if > the command is one (I am doing one update on all of rows) , right? . > > Moreover , in documentation the definition says that a not deferrable > constraints will check after "every command" , not after every row of the > command: > > http://www.postgresql.org/docs/9.1/static/sql-createtable.html > > DEFERRABLE > NOT DEFERRABLE > > This controls whether the constraint can be deferred.* A constraint that > is not deferrable will be checked immediately after every command*. > Checking of constraints that are deferrable can be postponed until the end > of the transaction (using the SET > CONSTRAINTS<http://www.postgresql.org/docs/9.0/static/sql-set-constraints.html> > command). NOT DEFERRABLE is the default. Currently, only UNIQUE, PRIMARY > KEY, EXCLUDE, and REFERENCES (foreign key) constraints accept this clause. > NOT NULL and CHECK constraints are not deferrable. > --------------- > > If this is "historical buggy behavior for performance" , I think we have to > change the definition of NOT DEFERRABLE in documentation, > because Postgresql is not checking at end of a dml, but for every row > modified by the command or there is something needs a patch. > > > Regards, Mat > Hello there, I think I have find a limit of this workaround. Imagine I have two tables in Oracle or other rdbms with a foreign key between them : testup3 ( a int) primary key on a NOT DEFERRABLE INITIALLY IMMEDIATE ; testup4 ( a int) foreign key on a references testup3(a) ; For first table I could create this (to have a "normal" sql standard behavior on update with multiple rows) : testup3 ( a int) primary key on a DEFERRABLE INITIALLY IMMEDIATE ; By the way I could not create a foreign key on a DEFERRABLE constraint , in fact I obtain an error like this : ERROR: cannot use a deferrable unique constraint for referenced table So if I have a normal ERD schema with FK , I could not use the workaround of "DEFERRABLE" constraints . I found an old discussion on this : <http://archives.postgresql.org/pgsql-hackers/2010-06/msg00151.php> http://archives.postgresql.org/pgsql-hackers/2010-06/msg00168.php In my opinion it could be a big limitation for who want migrate applications or is developing applications on different db. Any suggest or idea ? Regards, Mat