2010-05-14 33 views
21

Básicamente quiero usar uniqueidentifier de forma similar a la identidad. No quiero insertar valores en él, solo debe insertar valores automáticamente, diferente valor para cada fila. No puedo establecer el autoincremento en las columnas del tipo uniqueidentifier (la propiedad 'autoincrement' está establecida en false y no es editable).Autoincrement uniqueidentifier

Respuesta

27

O incluso mejor: utilice el newsequentialid() como valor predeterminado para su columna UNIQUEIDENITIFER. Eso te dará una serie de GUID algo secuencial.

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

El problema es: newsequentialid es solamente disponible de fábrica columna - no se puede llamar como una función o nada. Pero eso parece ajustarse a tus requisitos.

ACTUALIZACIÓN: no parece ser un error reconocido en SQL Server Management Studio que evita que especifica newsequentialid() como el valor predeterminado para una columna en el diseñador mesa interactiva.

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

Solución: crear la tabla sin especificar ningún defecto, a continuación, escriba en esta instrucción T-SQL en una ventana de consulta normal y ejecutarlo:

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

Que debe hacer el ¡truco!

+0

Eso no es un problema para mí. Tu respuesta parece ser lo que estaba buscando. Voy a intentarlo :) – drasto

+0

Recibí el mensaje "Error al validar el valor predeterminado para la Columna XY". ¿Podría controlar su código (un error tipográfico?)? – drasto

+0

@drasto: ejecuté ese código en SQL Server 2008 R2 antes de publicarlo, funciona. ¿Qué * versión * de SQL Server tienes ??? Quité corchetes adicionales alrededor de newsequentialid() - tal vez eso es un problema? Es seguro que funciona en 2008R2 –

3

Use NewID() como valor predeterminado. Al menos esto es lo que harías por SQL Server.

+0

esos no están exactamente en ninguna parte cerca de la secuencia/autoincremento g, aunque ..... –

+0

Lo he intentado pero parece generar siempre el mismo identificador (este: "00000000-0000-0000-0000-000000000000"). Así que cuando inserto la segunda fila me sale el error (atando para insertar la clave principal que ya está en uso) – drasto

+0

¡debe establecer newId() directamente en la definición de tabla dentro de su base de datos! – MUG4N

6

supongo que quiere decir en SQL Server y no en C# ...

Establecer la columna como clave principal y ROWGUID

RowGuid http://img341.imageshack.us/img341/8867/sqlserverrowguid.png

+2

¡solo asegúrate de que ** NO ** lo uses como el índice agrupado en la mesa !! –

+0

¿Por qué no? Lo estoy usando en un proyecto y funciona bien, todo parece normal, verifiqué el plan de ejecución, ordené las tablas, todo es normal ... – BrunoLM

+1

GUID como índice agrupado es terriblemente malo: revisa http: //www.sqlskills. com/BLOGS/KIMBERLY/post/GUIDs-as-PRIMARY-KEYs-andor-the-clustering-key.aspx - conducen a la fragmentación masiva de páginas e índices –

2

creo

CREATE TABLE dbo.YourTable 
(
    SerialID UNIQUEIDENTIFIER PRIMARY KEY DEFAULT newsequentialid() 
) 

es más simple

Cuestiones relacionadas