The problem here is that when you have, say, an FK AND a unique field in a table, and you try to insert something that violates BOTH of those constraints, PostgreSQL is gonna kick the query out on the first failure, and not try the other. Here:
=> create table g1 (id serial primary key, title text);
NOTICE: CREATE TABLE will create implicit sequence "g1_id_seq" for "serial" column "g1.id"
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "g1_pkey" for table "g1"
CREATE TABLE
=> create table g2 (id int4 primary key references g1(id),info text unique);
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "g2_pkey" for table "g2"
NOTICE: CREATE TABLE / UNIQUE will create implicit index "g2_info_key" for table "g2"
CREATE TABLE
=> insert into g1 values (DEFAULT,'abc');
INSERT 13004993 1
=> insert into g1 values (DEFAULT,'def');
=> insert into g1 values (DEFAULT,'def');
INSERT 13004994 1
smarlowe=> insert into g2 values (1,'zzz');
INSERT 13004995 1
=> insert into g2 values (3,'zzz');
ERROR: duplicate key violates unique constraint "g2_info_key"
=> insert into g2 values (3,'xyz');
ERROR: insert or update on table "g2" violates foreign key constraint "$1"
DETAIL: Key (id)=(3) is not present in table "g1".
The error messages are available via the pg_ interface, so I'm guessing that adodb has some feature to use those, but I'm not real familiar with ADODB