On Thu, 31 Jan 2002, DL Neil wrote:

> Date: Thu, 31 Jan 2002 21:28:04 -0000
> From: DL Neil <[EMAIL PROTECTED]>
> To: "William R. Mussatto" <[EMAIL PROTECTED]>
> Cc: [EMAIL PROTECTED]
> Subject: Re: next insert id (slightly OT)
> 
> William,
> 
> > > What should be understood is that MySQL's implementation of AUTO_INCREMENT 
>requires a particular/different
> > > philosophical view: that first the 'primary row' is to be stored, then the 
>AUTO_INCREMENT data captured, and
> > > finally the dependent row is stored (in the second table) - a reversal of the 
>earlier-mentioned approach. As
> > > soon as one understands how the whole job is to be done, the logic of the 
>individual components becomes
> > > 'obvious'. (and the old dog has to remember his new tricks!)
> > ...
> > I've run into one case where knowing the "next" ID would be useful was
> > where file names, being stored in the record contained the ID (for
> > performance reasons or maybe my bad design) since I was storing graphics
> > separately (for web work it makes great sense since the name needs to go
> > on the page not the data).  I had to do an insert, get the
> > LAST-INSERTED-ID, and then update the record.  I suspect that this is
> > really faster if there are multiple updated going on than locking the
> > table.  Also, it enables me to use fixed length records.
> 
> =one of the previous correspondents in this (the original) thread described how any 
>anticipatory calculation
> based upon LAST_INSERTED to arrive at the next AUTO_INCREMENT value was essentially 
>flawed. It will work in a
> single-user environment, but without locking, risks corruption if the scenario 
>allows for multiple
> concurrent-updates to the table.
That is why I did an add, got the LAST-INSERTED-ID.

> 
> =in this case, you avoided the 'look-ahead' but at the cost of an extra db update 
>call! (two for the price of
> one?)
> 
> =do you mean that the graphic file name was the same as the AUTO_INCREMENT value in 
>the corresponding tbl row?
> Do you further mean that the design featured only the one column, or was there an ID 
>column and a graphic name
> column?
The name was derived from the ID. This was so the display program could 
just grab it and go.  

> 
> =if the ID was the name, then to avoid the multi-user problem, the row could have 
>been saved and then
> LAST_INSERTED used to (re-)name the graphic file. This sequence being congruent to 
>the philosophy of MySQL's
> operation (as mentioned earlier/above) - why did you feel the need to name the file 
>before storing its data in
> the table? (why not sequence them the other way around?)
Ah, but the name had to go into the database at some point. 

> =if the ID and the filename were separate columns, then there was definitely no need 
>to use
> ancitipation/look-ahead, any name would do as long as it was unique - you don't care 
>and the machine knows no
> reason! In other words for row-x you could use the LAST_INSERTED value - the fact 
>that it was a copy of the ID
> from the previous row of the table would be neither here-nor-there (there's no 
>implicit, nor need there be an
> explicit, relationship between the two columns - and relational rules suggest that 
>there should not be in any
> case). This presumes that you will name the first file/data in the first row 
>yourself - filename 0000.filetype
> for example!
> =it's always a risk if you use a single field to mean two different things and yet 
>fulfill objectives in two
> different contexts (trouble is, we all try to get away with it...)

Caught me, I use a configuration table to tell the use of the various 
fields and if the field is of type file the contents is read and 
subsitituted.  This was mainly a reaction to a version of mysql (since 
fixed) that required the server be halted to do table reorgs.  (Yes yes I 
know its no longer true).  Also I'm a fan of fixed lenght records and 
putting large things on the file system and things that need to be 
searched in the database.

> 
> =BTW: yes I note that this is ancient history and not a current problem to be solved 
>- just watching out for the
> risk-factors that you discuss below, and the fact that someone else might want to 
>'learn' from your post.
> 
> > Didn't even think of locking the tables.
> 
> =too much hassle for this "bear of very little brain" too!
> 
> > BTW: an earlier poster mentioned DB2.  You have to have a separate Key
> > table and use an Update with a Sub Select and lock that table to get the
> > next key since DB2 still (as of the version I was using) have
> > auto-increment fields.
> 
> =there you go, I don't remember using AUTO_INCREMENT since I first used DB2 (that 
>was when the paint was still
> wet, and the performance about as slow pouring!) I think I've only ever 'patched' 
>DB2 calls - or translated them
> into ORACLE for the last 15 years...
> 
> > Don't know if its true, but a DBA I worked with insisted that MicroSoft's
> > SQL's auto-increment was flawed so we had to do the same thing there,
> > even though it did have auto-increment.  Perhaps a hold over from the
> > "doing it by hand" days..
> 
> =I've never been a great fan of MS SQL-Server, but I seem to recall that there was a 
>'discovered fault' of this
> nature in one (?early) release. It was fairly arcane IIRC. It was reasonably quickly 
>patched though. Meantime I
> do confess to using the incident as part of my 'proof' that the product wasn't 'up 
>to snuff' for
> corporate/enterprise systems...
> 
> =These days I would always use the RDBMS' AUTO_INCREMENT (or equivalent) feature. I 
>can think of no good reason
> (in any current 'mainstream' RDBMS) to manufacture a tbl ID/sequence - and if you 
>have to manufacture some
> accumulator in the dependent part of a row, then there is no way out (in a 
>multi-user environment) but to use
> locking and MAX() etc. [see also this topic discussed somewhere in the MySQL manual]
> 
> =Thanks for the memories!
> =dn
> 
> 

Sincerely,

William Mussatto, Senior Systems Engineer
CyberStrategies, Inc
ph. 909-920-9154 ext. 27


---------------------------------------------------------------------
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

Reply via email to