Column Uniqueness

I had a look at the Northwind database and found that I could add a new "Product" row having the same "ProductName". Is this how the table is supposed to work? The only uniqueness is on the identity column, which of cause is the primary key.

One would think that the "ProductName" should be unique, or am I not understanding the roles of these two columns correctly.

As far as I can see though, a mistake can be made if a data entry clerk captures a new row but a duplicate "ProductName". This would probably not be detected since the primary key is the identity column.

Is my reasoning correct, if so, then should I design a database making the "ProductName" column a primary key column?

When is using an identity column as the primary key not okay?
mitdanielsAsked:
Who is Participating?

[Product update] Infrastructure Analysis Tool is now available with Business Accounts.Learn More

x
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Kyle AbrahamsSenior .Net DeveloperCommented:
You can just add a unique constraint which will do the same thing.

Primary keys create physical indexes (sorted on the hard drive) for searching, and is by far the fastest way to access a table.

If you were to add that to your text column, then any time the data changed it would physically re-sort the info.  

EG:

    ID ONLY                           TEXT ONLY

1  Banana                          1    Banana
2  Orange                          2   Orange

becomes (after update tbl set name = 'Apple' where id = 2)

1  Banana                          2  Apple    
2  Apple                            1  Orange

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
Kent OlsenDBACommented:
>> should I design a database making the "ProductName" column a primary key column?

No.  A primary key is typically the fastest way to access a column.  If you're joining the table to another table by primary key, you want that to be as fast as possible.  Joining by a contrived integer (an identity) is faster than joining by data (a varchar).

>> When is using an identity column as the primary key not okay?

Almost always.  The entire point of an identity column is to be the primary key.

That said, there may be special circumstances where there is no need for a true primary key, but there is a need for uniqueness.  In that case, omitting the identity column and placing a unique index on the column should suffice.


Kent
mitdanielsAuthor Commented:
Thanks, how do I add a unique constraint to a column in SQL Server 2008R2?
Big Business Goals? Which KPIs Will Help You

The most successful MSPs rely on metrics – known as key performance indicators (KPIs) – for making informed decisions that help their businesses thrive, rather than just survive. This eBook provides an overview of the most important KPIs used by top MSPs.

Kyle AbrahamsSenior .Net DeveloperCommented:
ALTER TABLE <table>
ADD CONSTRAINT <NAME_OF_CONSTRAINT> UNIQUE (<col 1>,<col 2>)

note: can be just 1 column.
Kent OlsenDBACommented:
Hi Mit,

How many rows do you have in the table?  

The unique constraint is fine if you've got a small number of rows, but if you have a significant amount of data, and/or there are a lot of updates/inserts to the table, you should consider adding a UNIQUE INDEX on that column instead.

Both will ensure uniqueness, but the only way that the DBMS can validate uniqueness is to check the contents of the table.  If an appropriate index is available the DBMS will use it and the validation requires just an index search.  If there is no index available, the constraint will have to read an awful lot of data, which can be a performance killer.

Also, with the UNIQUE INDEX you'll have the added benefit of being able to use the index in your own queries if you need one.


Kent
mitdanielsAuthor Commented:
Thanks, that was really quick and very helpful.
mitdanielsAuthor Commented:
Not that it's a problem, but I see that the Contraint was added to the Indexes folder not the Constraints folder??
Kent OlsenDBACommented:
Hi Mit,

SQL Server implements a unique contraint by placing a unique index on the column(s).  I must admit that I don't know if the index is general enough to be used by user queries though.


Kent
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Databases

From novice to tech pro — start learning today.