Обсуждение: simulate multiple primary keys

Поиск
Список
Период
Сортировка

simulate multiple primary keys

От
Brandon Metcalf
Дата:
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

Re: simulate multiple primary keys

От
"Hartman, Matthew"
Дата:
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.


Re: simulate multiple primary keys

От
Brandon Metcalf
Дата:
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

Re: simulate multiple primary keys

От
Bill Moran
Дата:
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/

Re: simulate multiple primary keysx

От
Brandon Metcalf
Дата:
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

Re: simulate multiple primary keys

От
Lennin Caro
Дата:


--- 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