3 DBIx::Class::Manual::SQLHackers::DELETE - DBIx::Class for SQL Hackers - DELETE
7 =item L<Introduction|DBIx::Class::Manual::SQLHackers::Introduction>
9 =item L<CREATE|DBIx::Class::Manual::SQLHackers::CREATE>
11 =item L<INSERT|DBIx::Class::Manual::SQLHackers::INSERT>
13 =item L<SELECT|DBIx::Class::Manual::SQLHackers::SELECT>
15 =item L<UPDATE|DBIx::Class::Manual::SQLHackers::UPDATE>
19 =item L<BEGIN, COMMIT|DBIx::Class::Manual::SQLHackers::Transactions>
25 =head2 Delete a single row based on the primary key
30 The simplest form of delete removes a single row from a table using
31 the primary key value. We B<find> the row, then call the B<delete>
32 method on it. B<delete> can be called on any result row object.
36 =item 1. Create a Schema object representing the database you are working with:
38 my $schema = MyDatabase::Schema->connect('dbi:SQLite:my.db');
40 =item 2. Call the B<find> method on the resultset for the L<ResultSource|DBIx::Class::ResultSource> you wish to delete:
42 my $fred_user = $schema->resultset('User')->find({ id => 1 });
44 =item 3. Call B<delete> on the row object:
50 This can also be done as one statement, skipping the extra temporary
51 variable, if it is not needed later:
53 $schema->resultset('User')->find({ id => 1 })->delete;
55 In the first variant, the $fred_user row object will still contain the
56 last known contents of Fred's data. A call to L<$fred_user->in_storage|DBIx::Class::Row/in_storage> will return
57 false (0), showing that the row object is no longer connected to a actual
60 =head2 Delete one or more rows based on a WHERE clause
63 WHERE created_date <= '2000-01-01';
65 Use a ResultSet to define the WHERE clause using B<search>, then call
66 the B<delete> method on it directly.
70 =item 1. Create a Schema object representing the database you are working with:
72 my $schema = MyDatabase::Schema->connect('dbi:SQLite:my.db');
74 =item 2. Call the B<search> method on the resultset for the L<ResultSource|DBIx::Class::ResultSource> you wish to delete:
76 my $old_posts = $schema->resultset('Post')->search({
77 created_date => { '<=' => '2000-01-01' },
80 =item 3. Call B<delete> on the row object:
86 Unlike the single row deletion above, the contents of the rows to be
87 deleted are never fetched from the database, so no record of them now
90 NOTE: Calling B<delete> on a ResultSet object will not run any
91 overridden B<delete> methods in your Result Classes or any loaded
92 Components. To force these to run, call B<delete_all> instead:
94 $old_posts->delete_all();
96 This will also issue a separate delete statement for each row to be removed.
98 =head2 Cascading deletes
107 Cascading deletes ensure the integrity of your data, if a User row is
108 removed, then any items belonging to that user (for example comments
109 created by the user), should also be removed.
111 NOTE: This is a rather drastic action, to prevent problems in your
112 application, consider de-activating accounts instead of removing them!
114 For the time being DBIx::Class defaults to cascade deletion for the
115 following types of relationships: B<has_many>, B<has_one>,
116 B<might_have>. That is, it will automatically issue the above
117 statements. It is recommended not to rely on this implicit behavior,
118 as it will be deprecated in a later version of DBIC. Instead declare
119 proper cascading constraints in your RDBMS as described in
120 L<DBIx::Class::Manual::SQLHackers::CREATE/Table creation with
123 If your database is already properly set up to cascade deletes for you,
124 you can noop DBIx::Class' extra cascading statements:
126 __PACKAGE__->has_many('posts',
127 'MyDatabase::Schema::Result::Post',
129 { cascade_delete => 0 });