[Dbix-class] Problem with automatic primary keys

Daniel Westermann-Clark daniel at acceleration.net
Wed Jun 14 03:20:57 CEST 2006


On 2006-06-14 10:48:58 +1000, Robert Norris wrote:
> This is part of my Postgres setup:
> 
>     create sequence e_group_pk;
>     create table e_group (
>         groupid integer not null primary key,
>         name text not null
>     );

I almost always let PostgreSQL define my sequences:

CREATE TABLE e_group (
    groupid SERIAL PRIMARY KEY,
    name TEXT NOT NULL
);

This is equivalent to:

CREATE SEQUENCE e_group_pk;
CREATE TABLE e_group (
    groupid INTEGER PRIMARY KEY DEFAULT nextval('e_group_pk'),
    name TEXT NOT NULL
);

> I have this in my DBIC schema class to match:
> 
>     package Emma::Schema::Group;
>     use base qw(DBIx::Class);
>     __PACKAGE__->load_components(qw(PK::Auto Core));
>     __PACKAGE__->table("e_group");
>     __PACKAGE__->add_columns(qw(groupid name)); 
>     __PACKAGE__->set_primary_key("groupid");
>     __PACKAGE__->sequence("e_group_pk");

This looks good, though I've not needed to set the sequence
explicitly.  DBIx::Class has automatic sequence detection for some
databases, including PostgreSQL.

> My understanding is that PK::Auto will make it setup groupid
> automatically by getting a new value from the sequence. Is that
> right?

Sorta.  PK::Auto assumes the database will fill groupid itself.  On
insert it queries the storage backend for the "last insert id", then
sets the primary key field on your result instance.

Hope this helps,

-- 
Daniel Westermann-Clark



More information about the Dbix-class mailing list