I  am  running  MySQL  5.0  and  WAS  receiving  an  error for the SQL
statement that had the 'ON DUPLICATE KEY UPDATE'. After doing a little
investigation  and looking into the MySQL docs I have fixed the issue.

I  dropped  the  entire  WHERE  from the statement. According to MySQL
docs, there is no WHERE in the statement. If a record key exists, that
record is used in the 'ON DUPLICATE KEY UPDATE' part of the statement.

Or, maybe I downloaded the wrong version of the plugin.

On Saturday, December 31, 2005 at 5:55:31 AM, [EMAIL PROTECTED] confabulated:

> I have updated the INSERT code to use the "ON DUPLICATE KEY" feature of
> MySQL.  This feature insures that if the insert statement is executed
> and another insert has already occurred for the changing day, an update
> will take place instead.  Hopefully, this will alleviate the largest
> possibility of a race condition.  However, this is a feature of MySQL
> that is only available inside of MySQL 4.1 and greater.  If you are NOT
> running at least MySQL 4.1 you can get the old code from my website
> listed below.

> Where to get the changes -

> http://wiki.apache.org/spamassassin/StatsPlugin
> or
> http://www.okeating.net/blosxom.cgi/2005/12/31#statsplugin-update

> Let me know if you see any other issues or problems.
> Thanks for everyone's input, more is always appreciated.

> Thanks,
>   James

> Jim C. Nasby wrote:
>> On Wed, Dec 28, 2005 at 02:19:51AM -0600, Chris Thielen wrote:
>> 
>>>James Keating wrote:
>>>
>>>
>>>>Well the simplest fix is the one that I did not implement in the first 
>>>>place, using "ON DUPLICATE KEY".  However, I did not implement that 
>>>>because of its only being in version 4.1 of MySQL and I still use 
>>>>Debian stable for most production machines, which runs 4.0.x.
>>>>
>>>>Anyway, I will poke at it some more.
>>>>
>>>
>>>Read on for a portable fix called optimistic locking. 
>>>
>>>
>>>Pseudocode follows.  I assume you are doing something like this:
>> 
>> 
>> You assume wrong. :) The code is doing
>> 
>> UPDATE ... SET field = field + 1 ...
>> 
>> which is almost always a much better idea than doing the increment in
>> code.
>> 
>> The race condition is in checking to see if the row already exists, and
>> then using that information to decide if you should do an insert or an
>> update.
>> 
>> The example at the very bottom of http://lnk.nu/postgresql.org/5sl.html
>> is how you would do this in a function in PostgreSQL, though there's no
>> reason I can think of why you couldn't do that in perl instead (though
>> it would perform much slower).

--

"This message is made of 100% recycled electrons."

Reply via email to