It's probably not a good idea, because it depends on some
behaviour that is not specified, but I once used a trick
like this to get good performance:

CREATE TABLE abc(a, b);
UPDATE abc SET b = user2(a, b) WHERE <condition> AND user1(a, b);

SQLite loops through the rows where <condition> is true, and
remembers those for which user1() returns true. It then runs
a second loop through those rows and calls user2() for each
of the remembered rows, setting 'b' to the return value.

But like I said, it depends on unspecified behaviour so you
had better have some assert() statements to make sure SQLite
is calling the functions in the expected order.

Dan.

--- "D. Richard Hipp" <[EMAIL PROTECTED]> wrote:

> On Fri, 2005-05-13 at 15:16 +0100, Brandon, Nicholas wrote:
> > I think I might be getting confused on this subject as well. Does this mean
> > that SQLite 3.x can NOT process multiple inserts/updates within one
> > transaction if it is working on the same table?
> > 
> > ie Below would return "database table is locked"?
> > 
> > BEGIN TRANSACTION
> > SELECT * from table1 WHERE col > x
> > UPDATE table1 SET col = ...
> > INSERT INTO table1 ....
> > COMMIT TRANSACTION
> > 
> 
> You cannot simultaneously read and write from the same table.
> If you are in the middle of a SELECT on a table, you cannot
> UPDATE or INSERT or DELETE from that table until the SELECT
> is finished.  (NB: the SELECT is usually not finished until
> you call sqlite3_finalize() or sqlite3_reset() on the statement.
> For an exception to this rule, see solution (2) below.)
> 
> You can read and write the same table as many times as you
> want within the same transaction as long and the reading and
> writing do not overlap in time.
> 
> If you want to do an UPDATE on each row of a SELECT on the same
> table, you can do this in several ways.
> 
>   (1)  Load the results of the SELECT into a TEMP table, then
>        loop over the TEMP table to do your UPDATES:
> 
>          CREATE TEMP TABLE temp1 AS SELECT * FROM table1 WHERE...;
>          SELECT * FROM temp1;
>           -- for each row of result do:
>            UPDATE table1 SET ...;
> 
>   (2) Add an ORDER BY clause to the SELECT statement where the
>       ORDER BY clause contains at least one arithmetic expression.
>       For example:
> 
>         SELECT * FROM table1 WHERE ... ORDER BY rowid+1;
>          -- for each row of result do:
>           UPDATE table1 SET ...;
> 
>   (3) Store your UPDATEs in a temp table then execute them after
>       the SELECT has finished:
> 
>         CREATE TEMP TABLE updates(stmt TEXT);
>         SELECT * FROM table1 WHERE ...;
>           -- for each row of result do:
>           INSERT INTO updates VALUES('UPDATE table1 SET ...');
>         SELECT * FROM updates;
>           -- for each row of result, evaluate the stmt
>           -- column as SQL.
> 
> You can probably also think of schemes where you store either
> the SELECT results or the UPDATE statements in memory.  Note
> that technique (2) above works by moving the entire result set
> into memory for you.  Avoid solution (2) if your result set is
> exceedingly large.
> -- 
> D. Richard Hipp <[EMAIL PROTECTED]>
> 
> 



                
__________________________________ 
Yahoo! Mail Mobile 
Take Yahoo! Mail with you! Check email on your mobile phone. 
http://mobile.yahoo.com/learn/mail 

Reply via email to