none
Est il possible de definir une colonne unique et null? RRS feed

  • Question

  •  

    Bonjour à tous,

    Tout est dans le titre.

    Je souhaiterai définir un Integer ayant par défaut la valeur NULL mais ses valeurs doivent être UNIQUE.

    Par exemple ma colonne 'Col1' de ma table 'test' devrait accepter.

     

    insert
     into
     test (Col1) values
    (1)
    
    insert
     into
     test (Col1) values
    (2)
    
    insert
     into
     test (Col1) values
    (null
    )
    
    insert
     into
     test (Col1) values
    (null
    )
    
    insert
     into
     test (Col1) values
    (3)
    
    insert
     into
     test (Col1) values
    (null
    )
    
    Merci d'avance
    mardi 20 juillet 2010 16:13

Réponses

  • Bonsoir,

    Oui, sur SQL Server 2008, il très simple de créer ton index unique filtré (Merci mikedavem).

    J'ai trouvé une petite page qui peut vous donner une autre solution (en cas ou vous travaillez avec une version différente de 2008).

     

    http://blogs.codes-sources.com/loicbar/archive/2008/08/28/moi-je-suis-unique-mais-plusieurs-fois-null.aspx

     

    • Marqué comme réponse Vincez_TLSE mercredi 21 juillet 2010 21:57
    mercredi 21 juillet 2010 17:06

Toutes les réponses

  • Bonjour Vincez_TLSE,

    EN faite, il n'est pas possible de définir une clé primaire qui accepte la valeur NULL, mais tu peux utiliser un trigger qui te permettra de réaliser ceci, son script est le suivant :


    set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    GO

    CREATE TRIGGER [TEST_TR]
    ON [TEST]
    AFTER INSERT
    AS
    BEGIN
    SET NOCOUNT ON;
    DECLARE @col1 integer

    Begin Transaction

    select @col1=col1 from inserted

    if not @col1 is null
    if isnull((select count(col1) from test where col1=@col1),0)>1
    rollback transaction

    Commit Transaction

    END

     

     

     

     

     

     

     

    • Proposé comme réponse Bechir Gharbi mardi 20 juillet 2010 19:28
    mardi 20 juillet 2010 17:30
  • Bonjour,

    Merci pour la réponse que je vais me presser de creuser mais je précise que cette colonne n'est pas ma clé primaire.

    mercredi 21 juillet 2010 10:58
  • Salut,

    Oui, puisque vous ne pouvez pas créer une clé primaire qui accepte la valeur NULL,

    Vous pouvez améliorer votre trigger en ajoutant un message propre à vous en executant ce script : (Les messages utilisateurs commencent par les numéros 60001 et vous pouvez créer le 60002,60003...)

    use master
    EXEC sp_dropmessage @msgnum = 60001
    EXEC sp_addmessage @msgnum = 60001, @severity = 16,
    @msgtext = N'Ce code est unique ! END', 
    @lang = 'us_english',
    @Replace ='Replace'

    EXEC sp_addmessage @msgnum = 60001, @severity = 16,
    @msgtext = N'Ce code est unique ! END',
    @lang = 'French',
    @Replace ='Replace'

    et le Trigger sera comme suit :


    set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    GO

    CREATE TRIGGER [TEST_TR]
    ON [TEST]
    AFTER INSERT
    AS
    BEGIN
    SET NOCOUNT ON;
    DECLARE @col1 integer

    Begin Transaction

    select @col1=col1 from inserted

    if not @col1 is null
    if isnull((select count(col1) from test where col1=@col1),0)>1

    Begin
         Raiserror (60001,16,1)
         ROLLBACK 
         Return

    End

    Commit Transaction

    END

    Cordialement

     

     

     

     

     

     

    mercredi 21 juillet 2010 16:01
  • Bonsoir,

    Travaillez vous avec SQL Server 2008 ?

    Dans ce cas il est tout à fait possible de créer un index unqiue filtré pour votre besoin.

    ++


    MCDBA | MCITP SQL Server 2005 / SQL Server 2008 | LPI Linux 1
    mercredi 21 juillet 2010 16:47
    Modérateur
  • Bonsoir,

    Oui, sur SQL Server 2008, il très simple de créer ton index unique filtré (Merci mikedavem).

    J'ai trouvé une petite page qui peut vous donner une autre solution (en cas ou vous travaillez avec une version différente de 2008).

     

    http://blogs.codes-sources.com/loicbar/archive/2008/08/28/moi-je-suis-unique-mais-plusieurs-fois-null.aspx

     

    • Marqué comme réponse Vincez_TLSE mercredi 21 juillet 2010 21:57
    mercredi 21 juillet 2010 17:06
  • Merci beaucoup pour votre aide.

    Je suis sous SQL 2005 mais j'ai décidé de modifier la gestion de ma colonne.

     

    Cordialement,

    Vincez_TLSE

     

    mercredi 21 juillet 2010 21:57
  • Oui, il est possible de définir une contrainte d'unicité sur une colonne ou un groupe de colonne NULLable. Cependant SQL Server considère dans ce cas que vous ne pourrez rentrer qu'une seule occurrence de NULL ou combinaison occurrences ou figure du NULL. EN fait pour SQL Server c'est comme si NULL avait une signification. C'est un défaut du moteur relationnel de SQL Server d'ailleurs lié au moteur de stockage.

    Plusieurs choses sont possible pour contourner ce problème :

    1) créer une colonne calculée UNIQUE avec substitution d'un autoincrément (ou bien d'un GUID) au NULL

    2) combiner la création d'un index et d'un trigger

    J'ai donné les diverses solutions dans cet article : http://blog.developpez.com/sqlpro/p5818/ms-sql-server/contraintes-d-unicite-a-la-norme-sql-iso/

     

    A +

     


    Frédéric BROUARD, Spécialiste modélisation, SGBR relationnel, optimisation, langage SQL. Le site sur le langage SQL et les SGBD relationnels : http://sqlpro.developpez.com/ Expert SQL Server http://www.sqlspot.com : audit, optimisation, tuning, formation Le blog sur SQL / MS SQL Server http://blog.developpez.com/sqlpro * * * Enseignant CNAM PACA, ISEN Toulon, CESI/EXIA Aix En Provence * * *
    vendredi 23 juillet 2010 16:48
  • Bonjour,

     

    Merci à tous pour les réponses. Vincent, si vous avez d’autres questions n’hésitez pas de consulter les forums MSDN France.

     

    Cordialement,

    Alex

    ________________

    Publiez un article sur une de ces technologies : Visual Basic, C#, C++, .NET, ASP.NET, SQL Server, Silverlight, SharePoint 2010, SharePoint 2007

    Astuces pour Visual Studio 2010

    XNA – Développement jeux vidéo

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, WPF

    Café des usages

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

     

     

    mardi 27 juillet 2010 09:56