Published on

May 22, 2013

Adding Identity Column to an Existing Table in SQL Server

Recently, I received an interesting question from a reader regarding adding an identity column to an existing table in SQL Server. The reader explained that they had a table with a few columns, but it did not have an identity column. They wanted to add an identity column to the table, but they wanted the values to be based on the order sequence of another column in the table, rather than the default order of the table.

In the example provided by the reader, they had a table called TestTable with columns Col1 and Col2. They inserted some data into the table and then attempted to add an identity column using the ALTER TABLE statement. However, the identity values were assigned based on the default order of the table, not the desired order based on Col1.

Fortunately, there is a workaround for this situation. If the table does not have a clustered index, you can create one on the desired column (in this case, Col1) in the desired order (ASC or DESC). Once the clustered index is created, you can then add the identity column to the table. The identity values will be assigned based on the order of the clustered index.

Here is an example script that demonstrates this workaround:

USE tempdb

-- Create Table
CREATE TABLE TestTable (
    Col1 INT,
    Col2 VARCHAR(100)
)

-- Insert Data
INSERT INTO TestTable (Col1, Col2) VALUES (33, 'Pinal')
INSERT INTO TestTable (Col1, Col2) VALUES (22, 'Nupur')
INSERT INTO TestTable (Col1, Col2) VALUES (11, 'Shaivi')

-- Select Data
SELECT * FROM TestTable

-- Create Clustered Index on Column Col1
CREATE CLUSTERED INDEX IX_TestTable ON dbo.TestTable (Col1 ASC)

-- Add Identity Column
ALTER TABLE TestTable ADD ID INT IDENTITY(1, 1)

-- Select Data
SELECT * FROM TestTable

-- Clean up
DROP TABLE TestTable

By creating a clustered index on Col1 in ascending order, the table is ordered accordingly. Then, when the identity column is added, the values are assigned based on the order of the clustered index.

However, what if the table already has a clustered index and modifying it is not an option? In this case, dropping the table and recreating it is not a viable solution, especially if there are foreign keys associated with the table.

One alternative solution in this scenario is to create a new table with the desired structure and order, and then insert the data from the original table into the new table. This can be done using the SELECT INTO statement. Once the new table is created, you can add the identity column as desired.

Here is an example script that demonstrates this alternative solution:

USE tempdb

-- Create New Table with Desired Structure and Order
SELECT Col1, Col2, ROW_NUMBER() OVER (ORDER BY Col1 ASC) AS ID
INTO NewTable
FROM OriginalTable

-- Add Identity Column
ALTER TABLE NewTable ADD CONSTRAINT PK_NewTable PRIMARY KEY CLUSTERED (ID)

-- Select Data
SELECT * FROM NewTable

-- Clean up
DROP TABLE NewTable

In this script, a new table called NewTable is created with the desired structure and order. The ROW_NUMBER() function is used to generate the identity values based on the order of Col1. The identity column is then added to the new table, and the data is inserted from the original table. Finally, the original table is dropped.

These are two possible solutions to the problem of adding an identity column to an existing table in SQL Server. Depending on the situation, you can choose the appropriate solution that best fits your needs.

I hope you found this article helpful in understanding how to add an identity column to an existing table in SQL Server. If you have any further questions or suggestions, please feel free to leave a comment below.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.