IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

Errer:Impossible d'inserer une clé en double


Sujet :

MS SQL Server

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 8
    Points : 7
    Points
    7
    Par défaut Errer:Impossible d'inserer une clé en double
    Bonjour à tous,

    MsgErrer: Violation de la contrainte primary key...impossible d'inserer une clé en double.

    Voilà je veux inserrer seulement les enregistrements de la table source qui ne sont pas vers la table de destination dans une command INSERT.

    En MsAccess le fait de mettre une clé ne cause pas d'erreur lors de l'insert d'enregistrement en double, il les ignore simplement. Pourquoi j'ai cette erreur? Il existe surment une option ou une command pour désactiver ce message et de simplement ignorer les enregistrement déjà dans la table destination.

    merci

  2. #2
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 425
    Points : 358
    Points
    358
    Par défaut
    Il faudrait spécifier d'inserer uniquement les lignes qui n'existent pas encore.

    Ajoutes ceci à ta requête d'insertion
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Where Identifiant not exists in(Select identifiant from TableSource)
    J'espère que ça t'aidera

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Ta solution est bien mais je vois mal comment géré ce genre de vérification dans une base de donnés.

    Je dois vérifier chaque fois que je fais un INSERT dans une table si l'enregistrement existe déjà... c'est pas possible! Il dois surment avoir une solution.
    Je sais que MSAccess c'est pas SQL server mais ce genre de facon de faire s'éxécute sans problème en Access.

    Je relance donc la question! Existe t-il un autre moyen à mon problème

    merci encore

  4. #4
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Points : 4 414
    Points
    4 414
    Par défaut Re: Errer:Impossible d'inserer une clé en double
    Citation Envoyé par ericjean514
    Bonjour à tous,
    MsgErrer: Violation de la contrainte primary key...impossible d'inserer une clé en double.
    Vous avez posé une contraint qui interdit tout doublon sur la colonne clé primaire et vous voulez lui demandez le contraire !!!
    Mais croyez moi, il est très fidèle, il vous coince pour le respect des règles à la lettre.
    Citation Envoyé par ericjean514
    Voilà je veux inserrer seulement les enregistrements de la table source qui ne sont pas vers la table de destination dans une command INSERT.
    Quel est alors la commande qui le fait ?
    Peux-tu le poster ?
    Citation Envoyé par ericjean514
    En MsAccess le fait de mettre une clé ne cause pas d'erreur lors de l'insert d'enregistrement en double, il les ignore simplement.
    Dans ces conditions là, il ne sagit pas d'une clé primaire.
    Sinon, c'est faut. Et attention à ce que tu dis.
    Citation Envoyé par ericjean514
    Pourquoi j'ai cette erreur? Il existe surment une option ou une command pour désactiver ce message et de simplement ignorer les enregistrement déjà dans la table destination.
    merci
    Non, il n'y pas d'option pour cela.
    C'est à vous d'enlever ce qu'il ya déjà dans la table.

    Vous pouvez vous inspirer de ceci :

    Si vous avez une table source T_Source définit comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CREATE TABLE T_SOURCE(
    SOU_ID INT NOT NULL,
    SOU_VAL VARCHAR(50),
    CONSTRAINT PK_SOURCE PRIMARY KEY(SOU_ID)
    )
    ET une table destination T_destinatio
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CREATE TABLE T_DESTINATION(
    DES_ID INT NOT NULL,
    DES_VAL VARCHAR(50),
    CONSTRAINT PK_DESTINATION PRIMARY KEY(DES_ID)
    )
    Voici un script pour rappatrier les enregistrements de T_source qui ne sont pas dans T_DESTINATION.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT SOU_ID,SOU_VAL
    FROM T_SOURCE
    WHERE SOU_ID NOT IN (SELECT DES_ID 
                                        FROM T_DESTINATION
                                       )
    Et donc voici pour l'insert :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    INSERT INTO T_DESTINATION(DES_ID,DES_VAL)
    SELECT SOU_ID,SOU_VAL
    FROM T_SOURCE
    WHERE SOU_ID NOT IN (SELECT DES_ID 
                                        FROM T_DESTINATION
                                       )
    N'oublie pas le tag résolu.

  5. #5
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Points : 4 414
    Points
    4 414
    Par défaut
    Citation Envoyé par annedjomo
    Il faudrait spécifier d'inserer uniquement les lignes qui n'existent pas encore.

    Ajoutes ceci à ta requête d'insertion
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Where Identifiant not exists in(Select identifiant from TableSource)
    J'espère que ça t'aidera
    Je crois plutot qu'il faut vérifier dans la table destination.
    Un exemple fera l'affaire.

  6. #6
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 425
    Points : 358
    Points
    358
    Par défaut
    Citation Envoyé par WOLO Laurent
    Citation Envoyé par annedjomo
    Il faudrait spécifier d'inserer uniquement les lignes qui n'existent pas encore.

    Ajoutes ceci à ta requête d'insertion
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Where Identifiant not exists in(Select identifiant from TableSource)
    J'espère que ça t'aidera
    Je crois plutot qu'il faut vérifier dans la table destination.
    Un exemple fera l'affaire.
    Effectivement c'est ce que je voulais dire.

    Merci pour la remarque.

    A++

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Voilà la requete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	INSERT INTO iAgentNetBiosByCamp (Datestamp, HrsIn, HrsOut, AgentID, CampId, sHrsIn, sHrsOut)
    	SELECT convert(datetime,T.Datestamp,121), dbo.fn_FormatTime(T.Heure) as HrsIn,
    	dbo.fn_FormatTime((SELECT TOP 1 HEURE FROM [#@Session] where [#@Session].TypeConn='OUT' AND T.HEURE < [#@Session].heure)) AS HrsOut,
    	T.AgentID ,
    	T.CampId ,
    	dbo.fn_heurEnSeconde(dbo.fn_FormatTime(T.Heure)) as sHrsIn,
    	dbo.fn_heurEnSeconde(dbo.fn_FormatTime((SELECT TOP 1 HEURE FROM [#@Session] where [#@Session].TypeConn='OUT' AND T.HEURE < [#@Session].heure))) AS sHrsOut	
    	FROM [#@Session] AS T 
    	WHERE T.TypeConn='IN'
    	ORDER BY T.HEURE;
    Table source
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	CREATE TABLE #@Session (
    		Datestamp	VARCHAR(40),
    		Heure		VARCHAR(40),
    		CampId		VARCHAR(40),
    		AgentId		VARCHAR(40),
    		TypeConn	VARCHAR(40)
    	)
    Table destination
    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
     
    CREATE TABLE [dbo].[iAgentNetBiosByCamp] (
    	[Datestamp] [datetime] NOT NULL ,
    	[HrsIn] [nvarchar] (10) NOT NULL ,
    	[HrsOut] [nvarchar] (10) NULL ,
    	[CampID] [nvarchar] (10) NOT NULL ,
    	[AgentID] [nvarchar] (3) NOT NULL ,
    	[shrsIN] [numeric](18, 0) NULL ,
    	[sHrsOUT] [numeric](18, 0) NULL ,
    	[LogginTime] [numeric](18, 0) NULL 
    ) ON [PRIMARY]
    GO
     
    ALTER TABLE [dbo].[iAgentNetBiosByCamp] WITH NOCHECK ADD 
    	CONSTRAINT [PK_iAgentNetBiosByCamp] PRIMARY KEY  CLUSTERED 
    	(
    		[Datestamp] DESC ,
    		[HrsIn],
    		[CampID],
    		[AgentID]
    	)  ON [PRIMARY] 
    GO
    Tous le code
    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
    DECLARE @Session nvarchar(20)
    DECLARE CUR_SessionList CURSOR FOR 
    SELECT [Session]
    FROM dbo.[Qry - SessionList]
    OPEN CUR_SessionList
    FETCH NEXT FROM CUR_SessionList INTO @Session
    WHILE @@FETCH_STATUS = 0
    BEGIN
    	CREATE TABLE #@Session (
    		Datestamp	VARCHAR(40),
    		Heure		VARCHAR(40),
    		CampId		VARCHAR(40),
    		AgentId		VARCHAR(40),
    		TypeConn	VARCHAR(40)
    	) 
    	INSERT INTO #@Session
    	SELECT [DATE] as Datestamp, Heure, CampId, AgentId, TypeConn
    	FROM TbVoxcoFile
    	WHERE Session = @Session
    	ORDER BY Heure, CampId, AgentId, Session;
     
    	INSERT INTO iAgentNetBiosByCamp (Datestamp, HrsIn, HrsOut, AgentID, CampId, sHrsIn, sHrsOut)
    	SELECT convert(datetime,T.Datestamp,121), dbo.fn_FormatTime(T.Heure) as HrsIn,
    	dbo.fn_FormatTime((SELECT TOP 1 HEURE FROM [#@Session] where [#@Session].TypeConn='OUT' AND T.HEURE < [#@Session].heure)) AS HrsOut,
    	T.AgentID ,
    	T.CampId ,
    	dbo.fn_heurEnSeconde(dbo.fn_FormatTime(T.Heure)) as sHrsIn,
    	dbo.fn_heurEnSeconde(dbo.fn_FormatTime((SELECT TOP 1 HEURE FROM [#@Session] where [#@Session].TypeConn='OUT' AND T.HEURE < [#@Session].heure))) AS sHrsOut	
    	FROM [#@Session] AS T 
    	WHERE T.TypeConn='IN'
    	ORDER BY T.HEURE;
     
    	AND iAgentNetBiosByCamp
     
    	DROP TABLE #@Session
     
    	FETCH NEXT FROM CUR_SessionList 
    	INTO @Session
    END
    CLOSE CUR_SessionList
    DEALLOCATE CUR_SessionList
    merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. impossible d'inserer une ligne vide
    Par Belhachemi dans le forum Bases de données
    Réponses: 1
    Dernier message: 21/01/2013, 11h44
  2. [Framework] Impossible d'injecter une propriété "double" ou "float"
    Par flamant dans le forum Spring
    Réponses: 3
    Dernier message: 30/08/2010, 10h11
  3. Impossible d'inserer une date
    Par Epok75 dans le forum Zend_Db
    Réponses: 4
    Dernier message: 19/04/2008, 19h00
  4. Impossible d'inserer une tabulation dans un label
    Par NewbiePower dans le forum IHM
    Réponses: 4
    Dernier message: 21/11/2006, 15h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo