[Dbix-class] how to avoid adding duplicate row to table containing unique field/column

Trevor Leffler tleffler at uw.edu
Wed Oct 12 22:29:03 GMT 2011


Hi Rajeev,

See the docs on adding unique constraints [at the DBIC layer]:
http://search.cpan.org/dist/DBIx-Class-0.08121/lib/DBIx/Class/ResultSource.pm#add_unique_constraint

If 'userid' is already your primary key, you may omit the second 
argument to find_or_create().

Cheers,
--Trevor

Rajeev Prasad wrote:
> thx Rob,
> 
> I tried to use it like this:
> 
> for my $aref ( @newusers ) { 
>     print "adding [@$aref], or say $aref->[0]  \n";
>     $schema->resultset('Testdbuser')->find_or_create(
>         {
>           userid => $aref->[0],
>           password  => $aref->[1],
>         },
>         { key => 'userid' }
>       );
>     }
> 
> getting error:
> 
> DBIx::Class::ResultSet::find_or_create(): Unknown unique constraint 
> userid on 'testdbusers' at ./insertdb.pl line 25
> 
> 
> see below that my table does have a unique constraint on this column.
> 
> 
> ------------------------------------------------------------------------
> *From:* Rob Kinyon <rob.kinyon at gmail.com>
> *To:* Rajeev Prasad <rp.neuli at yahoo.com>; DBIx::Class user and developer 
> list <dbix-class at lists.scsys.co.uk>
> *Sent:* Wednesday, October 12, 2011 11:41 AM
> *Subject:* Re: [Dbix-class] how to avoid adding duplicate row to table 
> containing unique field/column
> 
> find_or_create is a method on DBIx::Class::ResultSet
> 
> On Wed, Oct 12, 2011 at 12:06, Rajeev Prasad <rp.neuli at yahoo.com 
> <mailto:rp.neuli at yahoo.com>> wrote:
> 
> 
> 
> 
>     there is a find_and_create function which can do the job, i am not
>     able to find help on it. does anyone know?
> 
> 
> 
> 
>     ------------------------------------------------------------------------
>     *From:* Rajeev Prasad <rp.neuli at yahoo.com <mailto:rp.neuli at yahoo.com>>
>     *To:* "dbix-class at lists.scsys.co.uk
>     <mailto:dbix-class at lists.scsys.co.uk>" <dbix-class at lists.scsys.co.uk
>     <mailto:dbix-class at lists.scsys.co.uk>>
>     *Sent:* Wednesday, October 12, 2011 10:33 AM
>     *Subject:* [Dbix-class] how to avoid adding duplicate row to table
>     containing unique field/column
> 
>     Hello,
> 
>     In my test script below, i am trying to figure out how to suppress
>     the error mesg when the the script try to add a previously presen
>     tentry into the table.
> 
>     OR better even, to make sure that the script should not even try to
>     update the table, if the record is already present in table. (table
>     may grow very big in future).
> 
> 
>     table:
>     Action	Keyname	Type	Unique	Packed	Column	Cardinality	Collation	Null
>     Comment
>     Edit Edit
>     <http://www.sking.att/phpMyAdmin/tbl_indexes.php?db=mysqltestdb&table=testdbusers&index=PRIMARY&token=6f24cb5736aa4533f388248e941da70f>
>     	Drop Drop
>     <http://www.sking.att/phpMyAdmin/sql.php?db=mysqltestdb&table=testdbusers&sql_query=ALTER+TABLE+%60testdbusers%60+DROP+PRIMARY+KEY&message_to_show=The+primary+key+has+been+dropped&token=6f24cb5736aa4533f388248e941da70f>
>     	PRIMARY	BTREE	Yes	No	userid	3	A	
>     	
>     Edit Edit
>     <http://www.sking.att/phpMyAdmin/tbl_indexes.php?db=mysqltestdb&table=testdbusers&index=userid&token=6f24cb5736aa4533f388248e941da70f>
>     	Drop Drop
>     <http://www.sking.att/phpMyAdmin/sql.php?db=mysqltestdb&table=testdbusers&sql_query=ALTER+TABLE+%60testdbusers%60+DROP+INDEX+%60userid%60&message_to_show=Index+userid+has+been+dropped&token=6f24cb5736aa4533f388248e941da70f>
>     	userid	BTREE	Yes	No	userid	3	A	
>     	
> 
> 
>     mysql> desc testdbusers;
>     +----------+-------------+------+-----+---------+-------+
>     | Field    | Type        | Null | Key | Default | Extra |
>     +----------+-------------+------+-----+---------+-------+
>     | userid   | char(6)     | NO   | PRI | NULL    |       |
>     | password | varchar(10) | YES  |     | NULL    |       |
>     +----------+-------------+------+-----+---------+-------+
>     2 rows in set (0.00 sec)
> 
>     mysql>
> 
>     mysql> show index from testdbusers;
>     +-------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
>     | Table       | Non_unique | Key_name | Seq_in_index | Column_name |
>     Collation | Cardinality | Sub_part | Packed | Null | Index_type |
>     Comment |
>     +-------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
>     | testdbusers |          0 | PRIMARY  |            1 | userid      |
>     A         |           3 |     NULL | NULL   |      | BTREE     
>     |         |
>     | testdbusers |          0 | userid   |            1 | userid      |
>     A         |           3 |     NULL | NULL   |      | BTREE     
>     |         |
>     +-------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
>     2 rows in set (0.00 sec)
> 
>     mysql>
> 
> 
> 
> 
>     script:
> 
>     #!/usr/bin/perl
>     use strict;
>     use warnings;
>     use lib '../testdb';
>     use Mysqltestdb::Schema;
>     my $schema;
>     my @newusers;
>     $schema =
>     Mysqltestdb::Schema->connect("dbi:mysql:dbname=mysqltestdb:localhost:3306",
>     'root', 'mypassword');
>     @newusers = (['te1234', 'pass'], ['te4567', 'pass']);
>     $schema->populate('Testdbuser', [
>        [qw/userid password/],
>        @newusers,
>     ]);
> 
> 
> 
> 
>     I get this info message out from script(error):
> 
>     DBIx::Class::Schema::populate(): Duplicate entry 'te1234' for key
>     'PRIMARY' for populate slice:
>     {
>       password => "pass",
>       userid => "te1234"
>     }
> 
> 
> 
>     _______________________________________________
>     List: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbix-class
>     IRC: irc.perl.org#dbix-class <http://irc.perl.org#dbix-class>
>     SVN: http://dev.catalyst.perl.org/repos/bast/DBIx-Class/
>     Searchable Archive:
>     http://www.grokbase.com/group/dbix-class@lists.scsys.co.uk
> 
> 
>     _______________________________________________
>     List: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbix-class
>     IRC: irc.perl.org#dbix-class <http://irc.perl.org#dbix-class>
>     SVN: http://dev.catalyst.perl.org/repos/bast/DBIx-Class/
>     Searchable Archive:
>     http://www.grokbase.com/group/dbix-class@lists.scsys.co.uk
> 
> 
> 
> 
> -- 
> Thanks,
> Rob Kinyon
> 
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> List: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbix-class
> IRC: irc.perl.org#dbix-class
> SVN: http://dev.catalyst.perl.org/repos/bast/DBIx-Class/
> Searchable Archive: http://www.grokbase.com/group/dbix-class@lists.scsys.co.uk



More information about the DBIx-Class mailing list