Update existing rows with squence number/char or any unique data
If you are happy with a number starting from 1 you can use row_number()
.
update T
set cn = rn
from (
select cn,
row_number() over(order by (select 1)) as rn
from TableX
) T
Even though I think you've created the column already, in this answer I'm going on the assumption that the column does not yet exist. IMO, a unique required column should never be added without planning how to populate the existing rows first. Therefore, I will provide the methods to do this starting from zero.
How you do this depends on what is involved in populating the values.
After whichever method you use, add an unique constraint on the column to ensure data integrity. For Methods 1 and 2, this can be done within the single statement or within a user transaction (not shown), and should be done within the user transaction in Method 3.
There are probably a few other obscure ways of doing this, but I think I've covered the most common.
Method 1: Add an IDENTITY column
ALTER TABLE MyTable ADD MyColumn int IDENTITY(1, 2) NOT NULL
This will populate all rows in the table with integer values starting with the seed value (1), increasing by the increment value (2) for every row. I believe the order the values get populated is undefined (if you have to specify an order, use Method 3).
Method 2: Populate using a default constraint
ALTER TABLE MyTable ADD MyColumn uniqueidentifier NOT NULL
CONSTRAINT DF_MyTable_MyColumn
DEFAULT (NEWSEQUENTIALID())
This will do three things atomically: 1. Add a column that does not allow NULL
values; 2. Create a default constraint for the column; 3. Populate each row in the table using the default constraint.
While this example uses a uniqueidentifier
column, it works just as well with any data type and default constraint.
Method 3: Populate using an UPDATE statement
This case would occur when, for example, there was a value from another part of your application that needs to be added to the table, or you need to specify an exact order for the unique values.
BEGIN TRANSACTION
ALTER TABLE MyTable ADD MyColumn int NULL
UPDATE MyTable
SET MyColumn = ...
ALTER TABLE MyTable ALTER COLUMN MyColumn int NOT NULL
COMMIT TRANSACTION
Method 4: Populate using a SEQUENCE object
For SQL Server 2012, you can populate a column using values generated by a SEQUENCE
object -- I haven't worked with this at all yet, so I will refer to a MSDN article for completeness.
The following updates column 'cn' with sequence number starting from 1
DECLARE @id INT
SET @id = 0
UPDATE X
SET @id = cn = @id + 1
GO
http://www.mssqltips.com/sqlservertip/1467/populate-a-sql-server-column-with-a-sequential-number-not-using-an-identity/