Re: steps to ensure referential integrity - Mailing list pgsql-admin

From aturner@neteconomist.com
Subject Re: steps to ensure referential integrity
Date
Msg-id 20030923174110.GG30555@neteconomist.com
Whole thread Raw
In response to Re: steps to ensure referential integrity  ("scott.marlowe" <scott.marlowe@ihs.com>)
Responses Re: steps to ensure referential integrity  (Robert Treat <xzilla@users.sourceforge.net>)
List pgsql-admin
On Tue, Sep 23, 2003 at 10:52:27AM -0600, scott.marlowe wrote:
> On Mon, 22 Sep 2003, Jodi Kanter wrote:
>
> > I have inherited a database that was originally created in postgres
> > version 6.? There were no steps taken at that time to implement
> > constraints to ensure referential integrity. There are no FK
> > constraints, PK constraints, etc..
> > Most of what currently exists is done in the existing code. I would like
> > to change this and am interested in getting suggestions. I expect that
> > PK constraints on each table as well as all FK constraints should be in
> > place. Anything else that I should consider?
> > I have indexes currently set up on a variety of fields, including PK
> > fields. Do the constraints automatically generate indexes on these
> > fields such that I should remove the ones created at the end of my script?
> > Thanks in advance for the suggestions!
>
> I would first upgrade to a reasonably new version of Postgesql 6.5.x is
> pretty old.  7.3.4 or so should be a good choice.  You'll find that you
> can add the pk/fk constraints in the conversion process, and still have a
> faster database with fk/pk under 7.3 than you'd have with no fk/pk
> constraints in 6.5.3
>

Creating a primary key also creates a unique index on that field(s).  Depending on how normalised the data schema is,
youmay also have to create stored procedures to gaurentee data integrity.  If the data is not currently good, you may
haveto remove bad data to get the constraints to check.  I'm no guru, but I do something like this to at least check: 

select count(distinct(id)) from table;
vs
select count(id) from table;

if the numbers are different, you have dup ids.

To get a list:
select id,count(*) from table group by (id);

I hope someone can figure out how how to put a where on that so it only returns those above 1, but I personaly don't
knowhow, so I'll use my friend the shell: 

psql database -Uuser -c 'select id,count(*) from table gropu by id' | grep -v '1$';

Alex Turner


pgsql-admin by date:

Previous
From: "Joshua D. Drake"
Date:
Subject: Re: [GENERAL] PostgreSQL query failed: ERROR: pg_atoi: zero-length
Next
From: "Nick Fankhauser - Doxpop"
Date:
Subject: PG version for n_distinct question.