When creating tables, I have created a practice of getting one column that's unique which I result in the primary key. This really is accomplished in four ways based on needs:

  1. Identity integer column that auto batches.
  2. Unique identifier (GUID)
  3. A brief character(x) or integer (or any other relatively small number type) column that may serve as a row identifier column

Number 4 could be employed for fairly small research, mostly read tables that may possess a unique static length string code, or perhaps a number value like a year or any other number.

Typically, other tables will either come with an auto-incrementing integer or unique identifier primary key.

The Question :-)

I've lately began dealing with databases which have no consistent row identifier and primary secrets are presently clustered across various posts. Some good examples:

  • datetime/character
  • datetime/integer
  • datetime/varchar
  • char/nvarchar/nvarchar

It is possible to valid situation with this? I'd have always defined a name or unique identifier column of these cases.

Additionally you will find many tables without primary secrets whatsoever. Do you know the valid reasons, if any, with this?

I am attempting to realise why tables specified for because they were, also it seems to become a large mess in my experience, but maybe there have been reasons for this.


OK... Wow! Lots of great reactions and discussion. I suppose I hit on the subject that's a bit religious without recognizing it. :-)

Another question to kind of assist me to decipher the solutions: In instances where multiple posts are utilized to comprise the compound primary key, it is possible to specific benefit to this process versus. a surrogate/artificial key? I am thinking mostly when it comes to performance, maintenance, administration, etc.?


You will find plenty of good solutions here, also it was hard to find the "best" one, so I have selected one I figured was useful, but did not receive as numerous votes, or more-chosen others that assisted answer my question.

I follow a few rules:

  1. Primary secrets ought to be no more than necessary. Should you prefer a number type because number types are saved in an infinitely more compact format than character formats. The reason being most primary secrets is going to be foreign secrets in another table in addition to utilized in multiple indexes. The more compact your key, the more compact the index, the less pages within the cache you'll use.
  2. Primary secrets should not change. Upgrading a principal key ought to always be unthinkable. The reason being its likely for use in multiple indexes and used like a foreign key. Upgrading just one primary key might cause of ripple effect of changes.

On surrogate versus natural key I make reference to the guidelines above. When the natural secret is small , won't ever change you can use it like a primary key. When the natural secret is large or prone to change I personally use surrogate secrets. If there's no primary key I still create a surrogate key because experience teaches you will invariably add tables for your schema and desire you'd put a pk in position.

Natural verses artifical secrets is really a type of religious debate one of the database community - see this short article yet others it links to. I am neither towards always getting artifical secrets, nor of never getting them. I'd pick a situation-by-situation basis, for instance:

  • US States: I'd choose condition_code ('TX' for Texas etc.), instead of condition_id=1 for Texas
  • Employees: I'd usually create an artifical worker_id, since it is difficult to find other things that actually works. SSN or equivalent may work, but there might be issues just like a new joiner who has not provided his/her SSN yet.
  • Worker Salary History: (worker_id, start_date). I'd not create an artifical worker_salary_history_id. What point wouldn't it serve (apart from "foolish consistency")

Wherever artificial secrets are utilized, it is best to also declare unique constraints around the natural secrets. For instance, use condition_id should you must, however it is recommended to declare a distinctive constraint on condition_code, otherwise you're certain to eventually finish track of:

condition_id    condition_code   condition_title

137         Texas           Texas

...         ...          ...

249         Texas           Texas