From: Peter Rabbitson <ribasushi@cpan.org> Date: Sat, 30 Jan 2010 12:11:18 +0000 (+0000) Subject: Draft PK explanation X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=ef8f6e190c35e6a87fb03ada9929ebb33474865c;p=dbsrgits%2FDBIx-Class-Historic.git Draft PK explanation --- diff --git a/lib/DBIx/Class/Manual/Intro.pod b/lib/DBIx/Class/Manual/Intro.pod index 4625d06..5d7c48b 100644 --- a/lib/DBIx/Class/Manual/Intro.pod +++ b/lib/DBIx/Class/Manual/Intro.pod @@ -397,6 +397,40 @@ L<DBIx::Class::ResultSet/ATTRIBUTES>. =head1 NOTES +=head2 The Significance and Importance of Primary Keys + +The concept of a L<primary key|DBIx::Class::ResultSource/set_primary_key> in +DBIx::Class warrants special discussion. The formal definition (which somewhat +resembles that of a classic RDBMS) is I<a unique constraint that is least +likely to change after initial row creation>. However this is where the +similarity ends. While in a RDBMS you can safely change any column within a +row, you can not do the same in DBIC because B<you will be breaking the tie +between a specific L<DBIx::Class::Row> object and a specific row in your +database>. Any time you call a CRUD operation on a row (e.g. +L<delete|DBIx::Class::Row/delete>, +L<update|DBIx::Class::Row/update>, +L<discard_changes|DBIx::Class::Row/discard_changes>, +etc.) DBIx::Class will use the B<current values> of the +L<primary key|DBIx::Class::ResultSource/set_primary_key> columns to populate +the C<WHERE> clause necessary to accomplish the operation. + +This is why it is important to declare a +L<primary key|DBIx::Class::ResultSource/set_primary_key> on all your result +sources B<even if the underlying RDBMS does not have one>. In a pinch one can +always declare each row identifiable by all its columns: + + __PACKAGE__->set_primary_keys (__PACKAGE__->columns); + +If you elect not to declare a C<primary key>, DBIx::Class will behave correctly +by throwing exceptions on any row operation that relies on unique identifiable +rows. If you inherited datasets with multiple identical rows in them, you can +still operate with such sets provided you only utilize +L<DBIx::Class::ResultSet> CRUD methods: +L<search|DBIx::Class::ResultSet/search>, +L<update|DBIx::Class::ResultSet/update>, +L<delete|DBIx::Class::ResultSet/delete> + + =head2 Problems on RHEL5/CentOS5 There used to be an issue with the system perl on Red Hat Enterprise