2010-05-14 13 views
21

Fondamentalement, je veux utiliser uniqueidentifier de la même manière que l'identité. Je ne veux pas y insérer des valeurs, Il devrait simplement insérer des valeurs automatiquement, une valeur différente pour chaque ligne. Je ne suis pas en mesure de définir autoincrement sur les colonnes de type uniqueidentifier (la propriété 'autoincrement' est définie sur false et n'est pas modifiable).Autoincrement uniqueidentifier

Répondre

27

Ou encore mieux: utilisez le newsequentialid() par défaut pour votre colonne UNIQUEIDENITIFER. Cela vous donnera une série séquentielle de GUID.

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

Le problème est: newsequentialid est uniquement disponible par défaut de la colonne - vous ne pouvez pas l'appeler en fonction ou quoi que ce soit. Mais cela semble correspondre à vos exigences. Il semble qu'il y ait un bogue reconnu dans SQL Server Management Studio qui empêche de spécifier newsequentialid() comme valeur par défaut pour une colonne dans le concepteur de table interactif.

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

Solution: créez votre table sans spécifier par défaut, puis tapez dans cette instruction T-SQL dans une fenêtre de requête normale et exécutez:

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

Cela devrait faire l' tour!

+0

Ce n'est pas un problème du tout pour moi. Votre réponse semble être ce que je cherchais. Je vais l'essayer :) – drasto

+0

J'ai "Erreur de validation de la valeur par défaut pour la colonne XY". Pourriez-vous s'il vous plaît contrôler votre code (une faute de frappe?)? – drasto

+0

@drasto: J'ai exécuté ce code sur SQL Server 2008 R2 avant de le publier - cela fonctionne. Quelle * version * de SQL Server avez-vous ??? J'ai enlevé des parenthèses supplémentaires autour du newsequentialid() - peut-être que c'est un problème? Est-ce que fonctionne sur 2008R2 pour sûr –

3

Utilisez NewID() comme valeur par défaut. Au moins, c'est ce que vous feriez pour SQL Server.

+0

ceux qui ne sont pas exactement près de séquentiel/auto-incrementin g, bien que ..... –

+0

J'ai essayé cela mais il semble toujours générer le même identifiant (celui-ci: "00000000-0000-0000-0000-000000000000"). Donc, lors de l'insertion de la deuxième ligne, je reçois l'erreur (liant pour insérer la clé primaire qui est déjà utilisée) – drasto

+0

vous devez définir newId() directement dans la définition de la table dans votre base de données! – MUG4N

6

Je suppose que vous voulez parler SQLServer et non C# ...

indique si la colonne clé primaire et ROWGUID

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

+2

assurez-vous juste que ** NON ** utilisez pour faire l'index clusterisé sur la table !! –

+0

Pourquoi pas? Je l'utilise sur un projet et fonctionne bien, tout semble normal, vérifié le plan d'exécution, l'ordre des tables, tout est normal ... – BrunoLM

+1

GUID comme index clusterisé sont horriblement mauvais: consultez http: //www.sqlskills. com/BLOGS/KIMBERLY/post/GUID-comme-PRIMARY-KEYs-andou-the-clustering-key.aspx - ils conduisent à une fragmentation massive des pages et des index –

2

Je pense

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

est simplier

Questions connexes