Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 11 sur 11
  1. #1
    Invité de passage
    Homme Profil pro Henri
    Architecte de base de données
    Inscrit en
    décembre 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Nom : Homme Henri
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : décembre 2012
    Messages : 7
    Points : 1
    Points
    1

    Par défaut Impossible de mettre en place une FK

    Bonjour,
    Je cherche à mettre en place une clé étrangère dans une table.
    J'ai en effet trois tables liées
    - individu_activite (KeyInd (PK, int, non null), KeyAct (PK, varchar(8), non null), KeyStr (PK, char(10), non null))
    - individu (KeyInd(PK, int, non null ))
    - activite (KeyAct (PK, varchar(8), non null), KeyStr (PK, char(10), non null))

    individu_activite à une FK originaire de la table individu sur la colonne KeyInd
    et je souhaiterais rajouter une FK originaire de la table activité sur les colonnes KeyAct et KeyStr

    Malheureusement j'obtiens le message suivant "les colonnes de la table activite ne correspondent pas à une clé primaire ou à une contrainte UNIQUE". C'est pourtant bien le cas.

    J'ai vraiment besoin des lumières d'un expert.

    En vous remerciant par avance.

    Cordialement

  2. #2
    Expert Confirmé Sénior
    Avatar de mikedavem
    Homme Profil pro David BARBARIN
    Architecte de base de données
    Inscrit en
    août 2005
    Messages
    4 592
    Détails du profil
    Informations personnelles :
    Nom : Homme David BARBARIN
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : août 2005
    Messages : 4 592
    Points : 9 165
    Points
    9 165

    Par défaut

    Tu peux nous fournir les DDL de tes tables + index ?

    ++

  3. #3
    Invité de passage
    Homme Profil pro Henri
    Architecte de base de données
    Inscrit en
    décembre 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Nom : Homme Henri
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : décembre 2012
    Messages : 7
    Points : 1
    Points
    1

    Par défaut

    Bonsoir,
    Il n'y a aucun déclencheur DDL et la requête : select * from sys.triggers ne retourne aucun résultat

    Les index des tables concernées ne sont pour l'instant que sur les PK.

    En espérant que cette réponse te donne une idée car c'est très obscure pour moi ce problème.

    Pour information et dans le doute j'ai fait un truncate sur les tables et retenter la création de la FK mais rien de probant. Ce n'était donc pas lié aux données non-plus.
    Cordialement

  4. #4
    Modérateur

    Homme Profil pro Fabien
    Ingénieur d'études en décisionnel
    Inscrit en
    septembre 2008
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Nom : Homme Fabien
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en décisionnel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : septembre 2008
    Messages : 6 840
    Points : 13 523
    Points
    13 523

    Par défaut

    DDL = Data Definition Language, c'est le script qui permet de créer vos tables (CREATE TABLE, CREATE INDEX).
    Aucune relation directe avec les déclencheurs.

    Vous pouvez le récupérer en sélectionnant vos tables dans SSMS, et clic droit générer un script, CREATE.

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro Frédéric BROUARD
    Expert SGBDR & SQL
    Inscrit en
    mai 2002
    Messages
    13 415
    Détails du profil
    Informations personnelles :
    Nom : Homme Frédéric BROUARD
    Localisation : France

    Informations professionnelles :
    Activité : Expert SGBDR & SQL
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 13 415
    Points : 27 569
    Points
    27 569

    Par défaut

    Citation Envoyé par Louty.fr Voir le message
    J'ai en effet trois tables liées
    - individu_activite (KeyInd (PK, int, non null), KeyAct (PK, varchar(8), non null), KeyStr (PK, char(10), non null))
    - individu (KeyInd(PK, int, non null ))
    - activite (KeyAct (PK, varchar(8), non null), KeyStr (PK, char(10), non null))
    Dans votre pseudo script PK signifie sans doute PRIMARY KEY... Or une table ne peut comporter qu'une seule primary key. Vous confondez visiblement PK et FK !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
    http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
    * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *

  6. #6
    Invité de passage
    Homme Profil pro Henri
    Architecte de base de données
    Inscrit en
    décembre 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Nom : Homme Henri
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : décembre 2012
    Messages : 7
    Points : 1
    Points
    1

    Par défaut Réponse SQLPro et Waldar

    Bonjours à vous deux,
    Mr Brouard : Non, je confirme qu'il n'y a pas de confusion, mais que dans la table activité la clé primaire est composée des deux colonnes (KeyAct et KeyStr).

    Mr Waldar : mille excuses interpréter un peu vite la question, le voici.

    Code :
    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 [IC_LOUTY]
    GO
     
    /****** Object:  Table [dbo].[Activite]    Script Date: 01/10/2013 10:50:03 ******/
    SET ANSI_NULLS ON
    GO
     
    SET QUOTED_IDENTIFIER ON
    GO
     
    SET ANSI_PADDING ON
    GO
     
    CREATE TABLE [dbo].[Activite](
    	[act_KeyStr] [char](10) NOT NULL,
    	[act_Analytique] [varchar](8) NOT NULL,
    	[act_NomCommercial] [varchar](30) NULL,
    	[act_SiteInternet] [varchar](30) NULL,
    	[act_NomComptable] [varchar](40) NOT NULL,
    	[act_DetailActivite] [varchar](500) NULL,
    	[act_DateDebut] [date] NULL,
    	[act_DateFin] [date] NULL,
    	[act_ModifieLe] [datetime] NULL,
    	[act_ModifiePar] [varchar](30) NULL,
    	[act_CreePar] [varchar](30) NULL,
    	[act_CreeLe] [datetime] NULL,
    	[act_Publiable] [char](10) NULL,
    	[act_Memo] [varchar](1000) NULL,
    	[act_ChiffreAffPrevAn] [numeric](16, 2) NULL,
    	[act_TextPresentation] [varchar](500) NULL,
    	[act_LienLogo] [varchar](50) NULL,
     CONSTRAINT [PK_Activite] PRIMARY KEY CLUSTERED 
    (
    	[act_KeyStr] ASC,
    	[act_Analytique] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
     
    GO
     
    SET ANSI_PADDING OFF
    GO
     
    ALTER TABLE [dbo].[Activite]  WITH CHECK ADD  CONSTRAINT [FK_Activite_Structure] FOREIGN KEY([act_KeyStr])
    REFERENCES [dbo].[Structure] ([str_Key])
    ON UPDATE CASCADE
    ON DELETE CASCADE
    GO
     
    ALTER TABLE [dbo].[Activite] CHECK CONSTRAINT [FK_Activite_Structure]
    GO
    Cordialement

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    janvier 2010
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : janvier 2010
    Messages : 2 978
    Points : 4 962
    Points
    4 962

    Par défaut

    Bonjour,

    Vous devez respecter l'ordre des colonnes dans votre script de définition de clef étrangère. C'est à dire indiquer

    Code :
    1
    2
    3
     
    ALTER TABLE individu_activite
    		ADD CONSTRAINT FK_individu_activite_activite FOREIGN KEY(KeyStr, KeyAct) REFERENCES Activite(act_KeyStr, act_analytique )
    et non pas

    Code :
    1
    2
    3
     
    ALTER TABLE individu_activite
    		ADD CONSTRAINT FK_individu_activite_activite FOREIGN KEY(KeyAct, KeyStr) REFERENCES Activite(act_analytique , act_KeyStr)
    Afin que sa corresponde à la définition de votre clef primaire.

    Cependant, vous avez un problème de modélisation. Que se passera-t-il quand une activité changera de structure ? la clef primaire de l'activité changera également...
    Votre table individu_activite mériterait une vraie clef primaire en entier autoincrémenté. ça vous aurait évité le présent souci, et ça vous en éviterait bien d'autres à l'avenir...

  8. #8
    Invité de passage
    Homme Profil pro Henri
    Architecte de base de données
    Inscrit en
    décembre 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Nom : Homme Henri
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : décembre 2012
    Messages : 7
    Points : 1
    Points
    1

    Par défaut

    Bonjour et merci,
    Vous devez respecter l'ordre des colonnes dans votre script de définition de clef étrangère.
    Je comprends et effectivement c'est une erreur.

    Cependant, vous avez un problème de modélisation. Que se passera-t-il quand une activité changera de structure ? la clef primaire de l'activité changera également...
    Votre table individu_activite mériterait une vraie clef primaire en entier autoincrémenté. ça vous aurait évité le présent souci, et ça vous en éviterait bien d'autres à l'avenir...
    Je comprends sur le fond la remarque mais le changement de structure pour une activité est justement prévu comme devant être impossible. C'est certes une erreur de modélisation, mais les données de cette table proviennent de tables d'un ERP qui utilise déjà la table individu_activité comme clé primaire.

  9. #9
    Invité de passage
    Homme Profil pro Henri
    Architecte de base de données
    Inscrit en
    décembre 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Nom : Homme Henri
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : décembre 2012
    Messages : 7
    Points : 1
    Points
    1

    Par défaut ordre des colonnes

    Sur la remarque 1 de aieeeuuuuu j'ai vérifié l'ordre des colonnes dans la requête était bon et j'ai donc toujours l'erreur :

    Code :
    1
    2
    3
    ALTER TABLE Individu_Activite
    		ADD CONSTRAINT FK_Individu_Activite_Activite FOREIGN KEY(ida_KeyStr, ida_KeyAct) 
    		REFERENCES Activite(act_KeyStr, act_Analytique )
    L'instruction ALTER TABLE est en conflit avec la contrainte FOREIGN KEY "FK_Individu_Activite_Activite". Le conflit s'est produit dans la base de données "IC_LOUTY", table "dbo.Activite".
    Désolé

  10. #10
    Modérateur

    Profil pro
    Inscrit en
    janvier 2010
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : janvier 2010
    Messages : 2 978
    Points : 4 962
    Points
    4 962

    Par défaut

    Ce n'est plus la même erreur, là il vous dit que vous ne pouvez pas poser la contrainte, car vous avez un problème d’intégrité dans vos données.

    que vous retourne
    Code :
    1
    2
    3
    4
    5
    6
    7
     
    SELECT Individu_Activite.* 
    FROM Individu_Activite
    LEFT JOIN Activite
        ON act_KeyStr = ida_KeyStr
        AND act_Analytique = ida_KeyAct 
    WHERE act_KeyStr IS NULL

  11. #11
    Invité de passage
    Homme Profil pro Henri
    Architecte de base de données
    Inscrit en
    décembre 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Nom : Homme Henri
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : décembre 2012
    Messages : 7
    Points : 1
    Points
    1

    Par défaut J'ai compris !

    Super! et merci aieeeuuuuu pour cette belle analyse.
    C'était bien un problème d'intégrité de données. Je me concentrais bêtement sur la pertinence des données de la table Activite alors que le problème venait de la table Individu_activite qui contenait des erreurs sur la colonne ida_KeyStr.
    En effet pour la valeur 10 dans la colonne Activite.act_KeyStr, j'avais 010 dans la colonne Individu_Activite.ida_KeyStr.
    C'est ballot et je vous remercie tous beaucoup pour cette assistance rapide.
    Bonne journée

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •