simulate multiple primary keys

Started by Brandon Metcalfalmost 17 years ago6 messagesgeneral
Jump to latest
#1Brandon Metcalf
brandon@geronimoalloys.com

I have the following table:

gms=> \d jobclock
Table "public.jobclock"
Column | Type | Modifiers
-------------+--------------------------------+----------------------------------------------------------------
jobclock_id | integer | not null default nextval('jobclock_jobclock_id_seq'::regclass)
employee_id | integer | not null
machine_id | character varying(4) | not null
workorder | character varying(8) | not null
operation | integer | not null
bartype | character varying(10) | not null
clockin | timestamp(0) without time zone | not null
clockout | timestamp(0) without time zone | default NULL::timestamp without time zone
comments | character varying(255) | default NULL::character varying
Indexes:
"jobclock_pkey" PRIMARY KEY, btree (jobclock_id)
...

I need to keep jobclock_id unique and not null, but I also need to
ensure that no row is duplicated. Is my best bet to drop the current
primary key and make a primary key out of the columns that I want to
ensure remain unique from row to row?

Thanks.

--
Brandon

#2Hartman, Matthew
Matthew.Hartman@krcc.on.ca
In reply to: Brandon Metcalf (#1)
Re: simulate multiple primary keys

Just create a unique constraint on all of the columns.

Matthew Hartman
Programmer/Analyst
Information Management, ICP
Kingston General Hospital
(613) 549-6666 x4294

-----Original Message-----
From: pgsql-general-owner@postgresql.org [mailto:pgsql-general-
owner@postgresql.org] On Behalf Of Brandon Metcalf
Sent: Thursday, July 02, 2009 1:28 PM
To: pgsql-general@postgresql.org
Subject: [GENERAL] simulate multiple primary keys

I have the following table:

gms=> \d jobclock
Table "public.jobclock"
Column | Type |
Modifiers

-------------+--------------------------------+-------------------------

---------------------------------------
jobclock_id | integer | not null default
nextval('jobclock_jobclock_id_seq'::regclass)
employee_id | integer | not null
machine_id | character varying(4) | not null
workorder | character varying(8) | not null
operation | integer | not null
bartype | character varying(10) | not null
clockin | timestamp(0) without time zone | not null
clockout | timestamp(0) without time zone | default

NULL::timestamp

without time zone
comments | character varying(255) | default

NULL::character

varying
Indexes:
"jobclock_pkey" PRIMARY KEY, btree (jobclock_id)
...

I need to keep jobclock_id unique and not null, but I also need to
ensure that no row is duplicated. Is my best bet to drop the current
primary key and make a primary key out of the columns that I want to
ensure remain unique from row to row?

Thanks.

--
Brandon

--
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

.now.

#3Brandon Metcalf
brandon@geronimoalloys.com
In reply to: Hartman, Matthew (#2)
Re: simulate multiple primary keys

M == Matthew.Hartman@krcc.on.ca writes:

M> Just create a unique constraint on all of the columns.

Ah. Didn't realize you could specify more than one column as part of
a unique constraint.

Thanks.

--
Brandon

#4Bill Moran
wmoran@potentialtech.com
In reply to: Brandon Metcalf (#1)
Re: simulate multiple primary keys

In response to Brandon Metcalf <brandon@geronimoalloys.com>:

I have the following table:

gms=> \d jobclock
Table "public.jobclock"
Column | Type | Modifiers
-------------+--------------------------------+----------------------------------------------------------------
jobclock_id | integer | not null default nextval('jobclock_jobclock_id_seq'::regclass)
employee_id | integer | not null
machine_id | character varying(4) | not null
workorder | character varying(8) | not null
operation | integer | not null
bartype | character varying(10) | not null
clockin | timestamp(0) without time zone | not null
clockout | timestamp(0) without time zone | default NULL::timestamp without time zone
comments | character varying(255) | default NULL::character varying
Indexes:
"jobclock_pkey" PRIMARY KEY, btree (jobclock_id)
...

I need to keep jobclock_id unique and not null, but I also need to
ensure that no row is duplicated. Is my best bet to drop the current
primary key and make a primary key out of the columns that I want to
ensure remain unique from row to row?

Your primary key can span multiple columns, i.e.
PRIMARY KEY(jobclock_id, employee_id, machine_id)
Could be more columns.

Keep in mind that this ensures that the combination of all those
columns is unique, which may or may not be what you want.

--
Bill Moran
http://www.potentialtech.com
http://people.collaborativefusion.com/~wmoran/

#5Brandon Metcalf
brandon@geronimoalloys.com
In reply to: Bill Moran (#4)
Re: simulate multiple primary keysx

w == wmoran@potentialtech.com writes:

...

w> Your primary key can span multiple columns, i.e.
w> PRIMARY KEY(jobclock_id, employee_id, machine_id)
w> Could be more columns.

w> Keep in mind that this ensures that the combination of all those
w> columns is unique, which may or may not be what you want.

Sure. I realize that a primary key can be made up of multiple
columns, but a unique constraint across the columns I need as
suggested by Matthew is what I was looking for.

Thanks.

--
Brandon

#6Lennin Caro
lennin.caro@yahoo.com
In reply to: Bill Moran (#4)
Re: simulate multiple primary keys
--- On Thu, 7/2/09, Brandon Metcalf <brandon@geronimoalloys.com> wrote:

From: Brandon Metcalf <brandon@geronimoalloys.com>
Subject: [GENERAL] simulate multiple primary keys
To: pgsql-general@postgresql.org
Date: Thursday, July 2, 2009, 5:27 PM
I have the following table:

  gms=> \d jobclock
               
               
              Table
"public.jobclock"
     Column    |   
          Type     
        |       
               
   Modifiers
 
-------------+--------------------------------+----------------------------------------------------------------
   jobclock_id | integer     
               
  | not null default
nextval('jobclock_jobclock_id_seq'::regclass)
   employee_id | integer     
               
  | not null
   machine_id  | character
varying(4)           |
not null
   workorder   | character
varying(8)           |
not null
   operation   |
integer             
          | not null
   bartype     |
character varying(10)          |
not null
   clockin     |
timestamp(0) without time zone | not null
   clockout    | timestamp(0)
without time zone | default NULL::timestamp without time
zone
   comments    | character
varying(255)         | default
NULL::character varying
  Indexes:
      "jobclock_pkey" PRIMARY KEY, btree
(jobclock_id)
  ...

I need to keep jobclock_id unique and not null, but I also
need to
ensure that no row is duplicated.  Is my best bet to
drop the current
primary key and make a primary key out of the columns that
I want to
ensure remain unique from row to row?

Thanks.

--
Brandon

--

It depends of a lot of variables, take two stage:

Stage 1
one employee_id can use some machine_id create you can create a unique key to employee_id

Stage 2
one employee_id can use one machine_id create you can create a unique key to employee_id,machine_id

is a example, but i think you have to normalize the table