Bill Benson
bensonforums at gmail.com
Fri Mar 7 15:16:34 CST 2014
John and Gustav, the code I wrote ended with the table in the condition that one cannot MANUALLY add a record. I don't know if inline SQL works, I did not try. It is pretty easy to drop those lines of code into the immediate window or a function, execute them, and see what I mean. I am not going to second guess Jet, and if anyone tells me the behavior makes sense to them, I will believe you LOL. Bill On Mar 7, 2014 1:28 PM, "John W Colby" <jwcolby at gmail.com> wrote: > Bill, > > Correct me if I am wrong but what is going on is that the autoincrement is > a SIGNED long integer, i.e. +/- 2^31. I never understood why they used a > signed long instead of an unsigned long but it is what it is. > > So... the way the autoincrement is supposed to work is that it increments > starting at 1 up until it would "roll over". What it rolls over TO is > -2^31 (a very large negative number) and then starts counting back towards > 0. Essentially it simply adds 1 to the number until it counts all the way > up to 2^33. When it reaches 2^31+1 it "rolls over and continues counting. > Since 2^33 won't fit in a 32 bit number, when it adds 2^33 ones it is back > to zero, i.e. it "rolls over" again. > > Back to your example, I think that you are trying to insert TWO values > into table A, the long int and the text value. Since the long in table A > is an autoincrement, try adding just the text value into Table A and see > what happens. > > John W. Colby > > Reality is what refuses to go away > when you do not believe in it > > On 3/7/2014 12:02 PM, Bill Benson wrote: > >> OK, this discussion has intrigued me like few others. I have found a fun >> and >> free way to corrupt my database. Play along boys and girls and I am sure >> it >> will be fun for you too. In the below example, B is used as a temp table >> to >> hold a couple of values for the fun and exciting purpose of destroying A's >> usefulness. >> >> CurrentDb.Execute "DROP TABLE [A];" >> CurrentDb.Execute "DROP TABLE [B];" >> CurrentDb.Execute "CREATE TABLE [A] (ID AUTOINCREMENT NOT NULL PRIMARY >> KEY, >> Field2 TEXT);" >> CurrentDb.Execute "CREATE TABLE [B] (ID LONG, Field2 TEXT);" >> CurrentDb.Execute "INSERT INTO B (ID, FIELD2) VALUES (-2147483648, >> 'DELETEME');" >> CurrentDb.Execute "INSERT INTO B (ID, FIELD2) VALUES (2147483647, >> 'DELETEME');" >> CurrentDb.Execute "INSERT INTO A SELECT * FROM B;" >> CurrentDb.Execute "DELETE FROM [A] WHERE ID =2147483647;" >> CurrentDb.Execute "DROP TABLE [B];" >> >> This leaves a single record in table A with ID = -2147483648 >> >> Now try and add a new record to A and you will find you cannot. Why >> doesn't >> it autoincrement to -2147483647 ? That is a very good question. Let's now >> delete the one record remaining and try again: >> >> CurrentDb.Execute "DELETE FROM [A] WHERE ID =2147483648;" >> >> Or alternatively >> CurrentDb.Execute "DELETE * FROM [A];" >> >> Now add a new record and you will see that the database begins a new >> record >> at ID = -2147483647!!!! >> >> DEFIES ALL LOGIC! It has been my pleasure to baffle you! >> >> > > --- > This email is free from viruses and malware because avast! Antivirus > protection is active. > http://www.avast.com > > -- > AccessD mailing list > AccessD at databaseadvisors.com > http://databaseadvisors.com/mailman/listinfo/accessd > Website: http://www.databaseadvisors.com >