Why database designers do not make IDENTITY columns start from the min value rather than 1?

If you find that 2billion values isn't enough, you're going to find out that 4billion isn't enough either (needing more than twice as many of anything over the lifetime of a project, than it was first designed for, is hardly rare*), so you need to take a different approach entirely (possibly long values, possibly something totally different).

Otherwise you're just being strange and unreadable for no gain.

Also, who doesn't have a database where they know that e.g. item 312 is the one with some nice characteristics for testing particular things? I know I have some arbitrary ids burned in my head. They may call it "so good they named it twice", but I'll always know New York as "city 657, covers most of our test cases". It's only a shorthand, but -2147482991 wouldn't be as handy.

*To add a bit to that. With some things you might say "ah about 100" and find it's actually 110, okay. With others you'll find actually it's actually 100,000 - you were out by orders of magnitude. The higher the number, the more often the mistake is of this sort due to the sort of problems that end up with estimates in the billions being different to those that end up with answers in the dozens. If you estimate 200 is your max in a given case, you should probably leave room for maybe a few hundred more. If you estimate 2billion in a given case, you should probably leave room for a few quadrillion more. That said, the only time I saw someone actually start an id at minus 2billion they ended up having about 3,000 rows.


On the SQL Server side the negative ID-s are ok, handled like positive numbers, so you could do that.

The others are right, you should think about different suggestion, but the major problems are the applications connected to your database.

Let say take MS Enviroment. Here is an example: .NET DataSet is using negative ID-s on autoincremented id-s to track changes in a code. So may you will have trouble, because:

The negative keys are used for temporary instances for the rows.

Here is the reference : MSDN

So definietly it is not a good idea to design a database like this for MSSQL in an MS Enviroment.


If you have a class that represent your table in your code (which is very likely to happen), everytime you will create a new object it will be assigned the ID 0 by default. It could lead to mistakes that overwrite data in the database if the ID 0 is already assigned. This also makes it easy to determine if an object is new or if it came from the database by just doing if (myObject.ID != 0)