Hello,

Dans une application, j'obtiens un message erreur signalant que je tente d'insérer de données dans une table et que ces données violent une clef alternative.

Voici le message :
Violation of UNIQUE KEY constraint 'AK_T_ACTIVATION_ACT'. Cannot insert duplicate key in object 'dbo.T_ACTIVATION_ACT'. The duplicate key value is (384, 163).
The statement has been terminated
Voici le DDL de la table (et de la clef) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
 
USE [GIFT_MANAGEMENT]
GO
 
/****** Object:  Table [dbo].[T_ACTIVATION_ACT]    Script Date: 05/23/2013 11:59:53 ******/
SET ANSI_NULLS ON
GO
 
SET QUOTED_IDENTIFIER ON
GO
 
SET ANSI_PADDING ON
GO
 
CREATE TABLE [dbo].[T_ACTIVATION_ACT](
    [ACT_ID] [int] IDENTITY(1,1) NOT NULL,
    [GFT_ID] [int] NOT NULL,
    [DOS_ID] [int] NOT NULL,
    [ACT_DATE] [datetime] NOT NULL,
    [ACT_CREATED_ON] [datetime] NOT NULL,
    [ACT_CREATED_BY] [varchar](100) NOT NULL,
    [ACT_MODIFIED_ON] [datetime] NULL,
    [ACT_MODIFIED_BY] [varchar](100) NULL,
 CONSTRAINT [PK_T_ACTIVATION_ACT] PRIMARY KEY CLUSTERED 
(
    [ACT_ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY],
 CONSTRAINT [AK_T_ACTIVATION_ACT] UNIQUE NONCLUSTERED 
(
    [GFT_ID] ASC,
    [DOS_ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [NDX]
) ON [PRIMARY]
 
GO
 
SET ANSI_PADDING OFF
GO
 
ALTER TABLE [dbo].[T_ACTIVATION_ACT]  WITH CHECK ADD  CONSTRAINT [FK_T_ACTIVATION_ACT_TJ_GFT_DOS_JGD] FOREIGN KEY([GFT_ID], [DOS_ID])
REFERENCES [dbo].[TJ_GFT_DOS_JGD] ([GFT_ID], [DOS_ID])
GO
 
ALTER TABLE [dbo].[T_ACTIVATION_ACT] CHECK CONSTRAINT [FK_T_ACTIVATION_ACT_TJ_GFT_DOS_JGD]
GO
 
ALTER TABLE [dbo].[T_ACTIVATION_ACT] ADD  CONSTRAINT [DF__T_ACTIVAT__ACT_C__02B25B50]  DEFAULT (getdate()) FOR [ACT_CREATED_ON]
GO
 
ALTER TABLE [dbo].[T_ACTIVATION_ACT] ADD  CONSTRAINT [DF__T_ACTIVAT__ACT_C__03A67F89]  DEFAULT (suser_sname()) FOR [ACT_CREATED_BY]
GO
Et voici les valeurs présentent actuellement dans la table concernée (en espérant que cela se présente bien sur le forum):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
ACT_ID    GFT_ID    DOS_ID    ACT_DATE    ACT_CREATED_ON    ACT_CREATED_BY    ACT_MODIFIED_ON    ACT_MODIFIED_BY
4827    384    162    2013-05-23 11:49:58.987    2013-05-23 11:49:59.040    INNO\geoffroy    NULL    NULL
4828    385    162    2013-05-23 11:49:58.987    2013-05-23 11:49:59.040    INNO\geoffroy    NULL    NULL
4829    386    162    2013-05-23 11:49:58.987    2013-05-23 11:49:59.040    INNO\geoffroy    NULL    NULL
4830    387    162    2013-05-23 11:49:58.987    2013-05-23 11:49:59.040    INNO\geoffroy    NULL    NULL
4831    388    162    2013-05-23 11:49:58.987    2013-05-23 11:49:59.040    INNO\geoffroy    NULL    NULL
On constate donc qu'il n'y a pas de violation car, pour moi, 162 est bien différent de 163 ^^.

Du coup, je ne comprends pas pourquoi j'obtiens ce message d'erreur