On Mon, 01 Oct 2001 14:44, Paul DuBois wrote: > At 11:44 AM +1200 10/1/01, marcus davy wrote: > >If you specify the keyword IGNORE in an INSERT, any rows that duplicate > >an existing PRIMARY or UNIQUE key in the table are ignored and are not > >inserted. > >But the last_insert_id() function still appears to increment by one > >in situations when the query is not adding any new information to > >the table. > > > >This looks like a bug to me can anyone enlighten me to this anomaly? > > Why is it a bug? > > INSERT IGNORE can't fully assess whether the record is to be ignored > until the record's contents have been generated. > > >I am using 3.23.42-log on red hat 7.1 (also same results on 3.23.40-log). > >I have searched the list archive for this topic but havent found anything > > yet. > >
I think it a potential bug corrupting primary keys on records where some duplicate information is ignored if you were using last_insert_id() in table generation. If I had a large relational database, and somewhere in the middle of that I had a unique table I was writing information to. If I was relying on the last_insert_id() value of this table as a primary key to other tables downstream, then every record where the INSERT IGNORE didnt add new information will corrupt that primary key of every furthur linked table (by 1 more than it should be). If the very last record also was IGNORED on the INSERT IGNORE, statement then you would get an empty set on a query of that last record, because its primary key is (n+1) which doesnt exist in the unique table. I also noticed that last_insert_id() increments for failed INSERT records... SELECT * from organism; #+-------+-------+ #| OM | OM_ID | #+-------+-------+ #| foo | 1 | #| fodda | 2 | #+-------+-------+ #2 rows in set (0.00 sec) INSERT INTO organism VALUES('fred',NULL); #Query OK, 1 row affected (0.00 sec) INSERT INTO organism VALUES('fred',NULL); #ERROR 1062: Duplicate entry 'fred' for key 2 SELECT * from organism; +-------+-------+ | OM | OM_ID | +-------+-------+ | foo | 1 | | fodda | 2 | | fred | 3 | +-------+-------+ 3 rows in set (0.00 sec) SELECT last_insert_id(); #+------------------+ #| last_insert_id() | #+------------------+ #| 4 | #+------------------+ #1 row in set (0.00 sec) # last_insert_id() STILL INCREMENTED 1 TOO MANY cheers, marcus ______________________________________________________ The contents of this e-mail are privileged and/or confidential to the named recipient and are not to be used by any other person and/or organisation. If you have received this e-mail in error, please notify the sender and delete all material pertaining to this e-mail. ______________________________________________________ --------------------------------------------------------------------- Before posting, please check: http://www.mysql.com/manual.php (the manual) http://lists.mysql.com/ (the list archive) To request this thread, e-mail <[EMAIL PROTECTED]> To unsubscribe, e-mail <[EMAIL PROTECTED]> Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php