Question : Unique index that ignores null values

I have a table in which there is a field called UserName. This field is not the primary key but it needs to be a unique key. This value is often left as null.

I built a unique index on that field but I had to remove it because null values are seen as duplicates. Is there a way to enforce uniqueness only if the value is not null.

Answer : Unique index that ignores null values

You must create a unique constraint if you need to enforce uniqueness of column UserName. However, This can be done if there are any duplicate values. Because of  UserName column is nullable, you have a lot of null values previously stored in it.

To resolve your problem, do the following:

1] Replace all null values with a unique value (I suggest GUID).
2] Create a UNIQUE constraint on column UserName.
3] Create a trigger to replace Null value on UserName column with GUID.

Check next code and let me know if works for you.

-- 1] Replace all null values with a
--    unique value.

declare cr_User cursor local
    for select UserName
          from Users
         where Username
               is null
open cr_User

while 1=1
  begin
    fetch cr_User
    if @@fetch_status<>0 break
    update Users
       set UserName
           =cast(newid() as varchar(36))
     where current of cr_User
  end

-- 2] Create a UNIQUE constraint on
--    column UserName

alter table users add constraint UQN_UserName unique (UserName)


-- 3] Create a trigger to replace Null
--    value on UserName column with
--    GUID.

create trigger TG_Users on Users
for insert,update
as
begin
  update Users
     set UserName
        =cast(newid() as varchar(36))
    from Inserted
   where Users.UserId
        =Inserted.UserId
end

PD: You don’t mention anything about your table’s structure so I assume UserName is varchar datatype column with at least 36-character length.
Random Solutions  
 
programming4us programming4us