Thread: add foreign key constraint after table creation?

add foreign key constraint after table creation?

From
Rory Campbell-Lange
Date:
I have two tables both of which have foreign key constraints on each
other. I presume I won't get into a deadlock situation... people can be
made independantly of objects, but if a person object is made this is
recorded in n_object_id.

My problem is that I cannot load my full table schema using \i as to
define peopel I need objects defined and vice versa. To get around this
I though I could define the foreign key constraint on people.n_object_id
after I had loaded everything. How do I do it? The alter table \h
command isn't very helpful!

CREATE TABLE people (
    n_id SERIAL PRIMARY KEY,
    n_object_id INTEGER DEFAULT NULL
                            references objects
                            ON UPDATE CASCADE
                            ON DELETE SET NULL,
    n_objects_counter INTEGER DEFAULT 0,
    b_hidden BOOLEAN DEFAULT false,
    dt_created TIMESTAMP DEFAULT current_timestamp,
    dt_modified TIMESTAMP DEFAULT current_timestamp,
    t_nickname VARCHAR(20) UNIQUE NOT NULL,
    t_firstname VARCHAR(20) NOT NULL,
    t_surname VARCHAR(25) NOT NULL,
    t_mobile VARCHAR(15) UNIQUE,
    t_email VARCHAR(30) UNIQUE,
    b_registered BOOLEAN DEFAULT false,
    n_email_status INT2 DEFAULT 0,
    n_txt_status INT2 DEFAULT 0,
    b_work_hours BOOLEAN DEFAULT false
);

CREATE TABLE objects (
    n_id SERIAL PRIMARY KEY,
    t_text_id VARCHAR(25) UNIQUE NOT NULL,
    b_hidden BOOLEAN DEFAULT false,
    dt_created TIMESTAMP DEFAULT current_timestamp,
    dt_modified TIMESTAMP DEFAULT current_timestamp,
    n_creator INTEGER NOT NULL
                       references people
                       ON UPDATE CASCADE
                       ON DELETE CASCADE,
    n_type INT2 NOT NULL DEFAULT 0,
    t_name VARCHAR(30) NOT NULL,
    t_description VARCHAR(200),
    t_location VARCHAR(100) DEFAULT NULL,
    t_postcode VARCHAR(10) DEFAULT NULL,
    n_id_photo INTEGER DEFAULT NULL
                       references photo
                       ON UPDATE CASCADE
                       ON DELETE SET NULL

);
...

--
Rory Campbell-Lange
<rory@campbell-lange.net>
<www.campbell-lange.net>

Re: add foreign key constraint after table creation?

From
Nabil Sayegh
Date:
Am Mon, 2003-05-26 um 20.21 schrieb Rory Campbell-Lange:

> My problem is that I cannot load my full table schema using \i as to
> define peopel I need objects defined and vice versa. To get around this
> I though I could define the foreign key constraint on people.n_object_id
> after I had loaded everything. How do I do it? The alter table \h
> command isn't very helpful!

I'm not sure but you could try opening a transaction (BEGIN) before the
inserts and COMMIT it at the end.
AFAIR that way it's possible to have the constraints checked at the end.

HTH
--
 e-Trolley Sayegh & John, Nabil Sayegh
 Tel.: 0700 etrolley /// 0700 38765539
 Fax.: +49 69 8299381-8
 PGP : http://www.e-trolley.de


Re: add foreign key constraint after table creation?

From
Dani Oderbolz
Date:
>
>
>CREATE TABLE people (
>    n_id SERIAL PRIMARY KEY,
>    n_object_id INTEGER DEFAULT NULL
>                            references objects
>                            ON UPDATE CASCADE
>                            ON DELETE SET NULL,
>    n_objects_counter INTEGER DEFAULT 0,
>    b_hidden BOOLEAN DEFAULT false,
>    dt_created TIMESTAMP DEFAULT current_timestamp,
>    dt_modified TIMESTAMP DEFAULT current_timestamp,
>    t_nickname VARCHAR(20) UNIQUE NOT NULL,
>    t_firstname VARCHAR(20) NOT NULL,
>    t_surname VARCHAR(25) NOT NULL,
>    t_mobile VARCHAR(15) UNIQUE,
>    t_email VARCHAR(30) UNIQUE,
>    b_registered BOOLEAN DEFAULT false,
>    n_email_status INT2 DEFAULT 0,
>    n_txt_status INT2 DEFAULT 0,
>    b_work_hours BOOLEAN DEFAULT false
>);
>
>CREATE TABLE objects (
>    n_id SERIAL PRIMARY KEY,
>    t_text_id VARCHAR(25) UNIQUE NOT NULL,
>    b_hidden BOOLEAN DEFAULT false,
>    dt_created TIMESTAMP DEFAULT current_timestamp,
>    dt_modified TIMESTAMP DEFAULT current_timestamp,
>    n_creator INTEGER NOT NULL
>                       references people
>                       ON UPDATE CASCADE
>                       ON DELETE CASCADE,
>    n_type INT2 NOT NULL DEFAULT 0,
>    t_name VARCHAR(30) NOT NULL,
>    t_description VARCHAR(200),
>    t_location VARCHAR(100) DEFAULT NULL,
>    t_postcode VARCHAR(10) DEFAULT NULL,
>    n_id_photo INTEGER DEFAULT NULL
>                       references photo
>                       ON UPDATE CASCADE
>                       ON DELETE SET NULL
>
>);
>...
>
>
Hi Rory,
maybe you should review your design.
I think you are recording a redundancy:
As soon as a given obect_id is recorded in the person,
you know that this person is the creator (ok,
maybe I am nor fully understanding your schema?).
If you need your design, it might help to treat the
relationship as if it was a many to many,
and putting a third table in between with just
(person_id, object_id, is_creator).

Just my 2 cents.

Cheers, Dani