Re: foreign key constraint not working when index tablespace - Mailing list pgsql-bugs

From Joel Krajden
Subject Re: foreign key constraint not working when index tablespace
Date
Msg-id 4249CA09.4000209@cs.concordia.ca
Whole thread Raw
In response to Re: foreign key constraint not working when index tablespace is not default.  (Tom Lane <tgl@sss.pgh.pa.us>)
Responses Re: foreign key constraint not working when index tablespace is not default.
List pgsql-bugs
Hi  Tom,

Ok. You are right but I am not crazy (yet).

If I create the tables and indexes as user postgres it works like a charm.


But if I create the tables as a mortal user or create them as postgres but in
the schema of user joelk and grant all to user joelk, I can insert data
without the foreign key constraint being respected. Now if I drop the foreign
key constraint and recreate it with a schema prefix in the references section,
the constarint works fine.

alter table joelk.jk_users add FOREIGN KEY (department) REFERENCES
joelk.jk_map(code);

fis=> INSERT INTO joelk.jk_users VALUES( 'fancott', 'Fancott, T.',
'fancott@cs.concordia.ca', '08', 'Professor' );
ERROR:  insert or update on table "jk_users" violates foreign key constraint
"jk_users_department_fkey"
DETAIL:  Key (department)=(08) is not present in table "jk_map".

fis=> \d jk_users              Table "joelk.jk_users"
    Column   |          Type          | Modifiers
------------+------------------------+-----------
  username   | character varying(8)   |
  name       | character varying(64)  | not null
  email      | character varying(128) |
  department | character varying(2)   | not null
  title      | character varying(64)  | not null
Indexes:
     "jk_users_pkey" PRIMARY KEY, btree (name, department, title)
Foreign-key constraints:
     "jk_users_department_fkey" FOREIGN KEY (department) REFERENCES jk_map(code)


Everything also works fine if a mortal user creates the tables and indexes in
the appropriate tablespaces and uses the schema.table(column_name) in the
references section of the foreign key constraint.

Strange.

Not sure if this is relevant - in this database I dropped the public schema
and I had to grant all to the group public so that users could create indexes
in the fis_index tablespace.

fis=> \db+
                                       List of tablespaces
     Name    |  Owner   |             Location              |         Access
privileges
------------+----------+-----------------------------------+-----------------------------------
  fis        | postgres | /local/data/pgsql-8.0/fis         |
  fis_index  | postgres | /local/data/pgsql-8.0/fis_index   |
{postgres=C/postgres,=C/postgres}


  Thanks for looking into it.

Regards

joel

Tom Lane wrote:
> Joel Krajden <joelk@cs.concordia.ca> writes:
>
>>If the indexes are created in fis_index, the foreign key constraints in the
>>user table are ignored on insert and update.
>
>
> Works for me...
>
> $ mkdir /tmp/fis
> $ mkdir /tmp/fis_index
> $ psql regression
> ...
> regression=# create tablespace fis location '/tmp/fis';
> CREATE TABLESPACE
> regression=# create tablespace fis_index location '/tmp/fis_index';
> CREATE TABLESPACE
> regression=# \i joel.sql
> psql:joel.sql:11: NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "dept_map_pkey" for table "dept_map"
> CREATE TABLE
> psql:joel.sql:23: NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "card_category_map_pkey" for table
"card_category_map"
> CREATE TABLE
> psql:joel.sql:38: NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "fis_title_map_pkey" for table
"fis_title_map"
> CREATE TABLE
> psql:joel.sql:57: NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "users_pkey" for table "users"
> CREATE TABLE
> regression=# insert into users values('username','name','email','dp','title');
> ERROR:  insert or update on table "users" violates foreign key constraint "users_department_fkey"
> DETAIL:  Key (department)=(dp) is not present in table "dept_map".
> regression=# insert into dept_map values('dp','desc');
> INSERT 0 1
> regression=# insert into users values('username','name','email','dp','title');
> ERROR:  insert or update on table "users" violates foreign key constraint "users_title_fkey"
> DETAIL:  Key (title)=(title) is not present in table "fis_title_map".
> regression=# insert into fis_title_map values('title','cardcat');
> ERROR:  insert or update on table "fis_title_map" violates foreign key constraint "fis_title_map_card_category_fkey"
> DETAIL:  Key (card_category)=(cardcat) is not present in table "card_category_map".
> regression=# insert into card_category_map values('cardcat','desc');
> INSERT 0 1
> regression=# insert into fis_title_map values('title','cardcat');
> INSERT 0 1
> regression=# insert into users values('username','name','email','dp','title');
> INSERT 0 1
> regression=#
>
>             regards, tom lane


--
| Joel Krajden              | Rm: LB-915,  Tel: 514 848-2424 3052         |
|                           | Fax: 514 848-2830                           |
| Senior Systems Analyst    | Email: joelk@cs.concordia.ca                |
| Engineering & Computer Sc.| http://www.cs.concordia.ca/~staffcs/joelk   |
| Concordia University      |   Remember it's a circus and the clowns     |
| Montreal, Canada          |   are supposed to make you laugh, not cry.  |

pgsql-bugs by date:

Previous
From: "Magnus Hagander"
Date:
Subject: Re: Error in Installation 8.0RC1 on Windows XP
Next
From: Tom Lane
Date:
Subject: Re: foreign key constraint not working when index tablespace is not default.