views:

319

answers:

4

Basically I want to use uniqueidentifier in similar way as identity. I don't want to insert values into it, It should just insert values automatically, different value for each row. I'm not able to set autoincrement on columns of type uniqueidentifier(the property 'autoincrement' is set to false and is not editable).

A: 

Use NewID() as the default value. At least this is what you would do for SQL Server.

Randy Minder
those aren't exactly anywhere near sequential / auto-incrementing, though.....
marc_s
I've tried this but it seems to generate always the same identifier (this one: "00000000-0000-0000-0000-000000000000"). So when inserting the second row I get the error (tying to insert primary key that is already used)
drasto
you should set newId() directly in table definition within your database!
MUG4N
+2  A: 

Or even better: use the newsequentialid() as the default for your UNIQUEIDENITIFER column. That'll give you a somewhat sequential series of GUIDs.

CREATE TABLE dbo.YourTable   
   (SerialID UNIQUEIDENTIFIER 
        CONSTRAINT DF_SerialID DEFAULT newsequentialid(),
     .... (other columns)......
   )

Trouble is: newsequentialid is only available as a column default - you cannot call it as a function or anything. But that seems to fit your requirements.

UPDATE: there appears to be an acknowledged bug in SQL Server Management Studio that prevents specifying newsequentialid() as the default for a column in the interactive table designer.

See: http://social.msdn.microsoft.com/Forums/en-US/sqltools/thread/cad8a4d7-714f-44a2-adb0-569655ac66e6

Workaround: create your table without specifying any default, and then type in this T-SQL statement in a normal query window and run it:

ALTER TABLE dbo.YourTable
    ADD CONSTRAINT DF_SerialID DEFAULT newsequentialid() FOR SerialID

That should do the trick!

marc_s
That is not trouble at all for me. Your answer seems to be what I was looking for. I'm going to try it :)
drasto
I got "Error validating the default for Column XY". Could you please control your code(a typo?) ?
drasto
@drasto: I ran that code on SQL Server 2008 R2 before I posted it - it works. What *version* of SQL Server do you have??? I removed extra brackets around the newsequentialid() - maybe that is a problem? Is works on 2008R2 for sure
marc_s
The one that is pre-installed in VS 2010 Ultimate edition. I'm not sure where I find the version of the server but I'll look for it.
drasto
@drasto: seems to be a SQL Server Management Studio bug: http://social.msdn.microsoft.com/Forums/en-US/sqltools/thread/cad8a4d7-714f-44a2-adb0-569655ac66e6 - type in the statement as SQL code and run it!
marc_s
I can try to ignore the error... It asks me if I want to keep the settings or cancel because of error. But I guess it will not work.
drasto
Finally I decide to use identity but I guess your solution would work.
drasto
+1  A: 

The lame thing about newsequentialid is that its only sequential until the sql server service restarts. WTF? Thats super lame.

NickAtuShip
+2  A: 

I guess you mean in SQLServer and not C#...

Set the column as PRIMARY KEY and ROWGUID

RowGuid

BrunoLM
just make sure **NOT** use make it the clustered index on the table!!
marc_s
Why not? I'm using it on a project and works fine, everything looks normal, checked the execution plan, table ordering, everything is just normal...
BrunoLM
@BrunoLM: GUID as clustered index are horribly bad: check out http://www.sqlskills.com/BLOGS/KIMBERLY/post/GUIDs-as-PRIMARY-KEYs-andor-the-clustering-key.aspx - they lead to massive page and index fragmentation
marc_s