Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1070 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQL] Question sur foreign key

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[SQL] Question sur foreign key

n°1273627
Siron
Posté le 27-12-2005 à 11:52:27  profilanswer
 

Bonjours, j'aimerais avoir quelques explications sur la contrainte foreign key.
 
Mon inconnue est surtout de savoir si la colonne d'une table liée avec la foreign key à une colonne primaire d'une autre table peut avoir des redondances ?
 
Exp :
 
CREATE TABLE toto (
nom VARCHAR(10) NOT NULL PRIMARY KEY,
);
 
CREATE TABLE clone (
nom VARCHAR(10) NOT NULL,
);
 
ADD CONSTRAINT verification PRIMARY KEY (nom) REFERENCE toto
 
C'est bon comme base de donné ?  Sachant que la table clone peut avoir plusieur fois le même nom et que la table toto ne peux paa avoir plusieurs fois le même nom, la contrainte vérifie que chaque clone est bien d'un toto.
 
Merci d'avance pour les réponses.
 
Siron


Message édité par Siron le 27-12-2005 à 11:52:42
mood
Publicité
Posté le 27-12-2005 à 11:52:27  profilanswer
 

n°1273631
Arjuna
Aircraft Ident.: F-MBSD
Posté le 27-12-2005 à 11:58:25  profilanswer
 

à vue de nez, t'as créé une 1,1 là, pas une 1,n
 
le mot clé pour une clé étrangère, c'est foreign key, pas primary key...

n°1273633
Arjuna
Aircraft Ident.: F-MBSD
Posté le 27-12-2005 à 11:59:24  profilanswer
 

d'ailleurs, je comprends pas trop ta ligne, tu indiques pas sur quoi tu crée la contrainte en question.


Message édité par Arjuna le 27-12-2005 à 11:59:31
n°1273656
Siron
Posté le 27-12-2005 à 12:34:02  profilanswer
 

Bon, j'ai du mal comprendre comment ça fonctionne.
 
D'aprés ce que on ma dit, si dans la contrainte foreign key je n'indique pas la colonne, elle s'applique directement sur la clé primaire de la table de référence.
 
Mais apparament je dois définir la colonne comme foreign key ?, ce que je ne vois pas dans mon cour.
 
Et je n'ai toujours pas compris si la colonne à laquel on applique l'altération doit être comme "unique".

n°1273660
Arjuna
Aircraft Ident.: F-MBSD
Posté le 27-12-2005 à 12:42:16  profilanswer
 

normalement oui, mais indique quand même la clé, t'as aucune garantie que ce soit portable d'un sgbd à l'autre.
 
sinon, là je ne connais pas ta syntaxe, mais il semblerait que tu as créé une clé primaire sur "clone" qui prends les valeurs de la clé primaire de "toto", c'est donc une clé étrangère de type 1,1 (ou 0,1)
 
donc à priori, les valeurs dans "clone" seront unique et devront obligatoirement être présentes dans "toto". on utilise ce genre de relation lorsqu'on a une table qui contient des éléments facultatifs liés à une autre table qui contient la partie "globale" des enregistrements.
 
une vrai clé étrangère, c'est :
 
add contrant fk_toto on clone (nom) reference toto (nom);
 
ainsi, la colonne "nom" de "clone" devra contenir uniquement des valeurs présentes dans la colonne "nom" de "toto". par contre, tu peux avoir des doublons dans "clone".
 
un exemple simple :
 
create table commande
(
   id as numeric not null primary key,
   reference as varchar not null
);
 
create table cde_ligne
(
   cde_id as numeric not null,
   num_ligne as numeric not null,
   pro_id as numeric not null,
   quantite as numeric not null
);
 
add constraint pk_cde_ligne primary key on cde_ligne (cde_id, num_ligne);
add constraint fk_cde_id foreign key on cde_ligne (cde_id) reference commande (id);


Message édité par Arjuna le 27-12-2005 à 12:43:40
n°1273661
Arjuna
Aircraft Ident.: F-MBSD
Posté le 27-12-2005 à 12:42:41  profilanswer
 

à quelques fautes de syntaxe près, je ne suis pas pas habitué à écrire les scripts de création de base à la main ;)

n°1273770
Siron
Posté le 27-12-2005 à 16:32:26  profilanswer
 

Le as est obligatoire pour définir le type ?
 
 

Citation :

une vrai clé étrangère, c'est :
 
add contrant fk_toto on clone (nom) reference toto (nom);
 
ainsi, la colonne "nom" de "clone" devra contenir uniquement des valeurs présentes dans la colonne "nom" de "toto". par contre, tu peux avoir des doublons dans "clone".


 
Donc apparemment déjà je me trompe pas dans la signification de foreign key, mais dans ton exemple il manque pas le foreign key ?
 
Merci pour l'aide.

n°1273788
Arjuna
Aircraft Ident.: F-MBSD
Posté le 27-12-2005 à 17:04:41  profilanswer
 

ouais, j'ai oublié le mot clé :)
 
le second exemple doit être bon par contre

n°1273789
Arjuna
Aircraft Ident.: F-MBSD
Posté le 27-12-2005 à 17:05:21  profilanswer
 

sinon, oui, tu ne te trompes pas, sauf que ce que tu as posté là haut, c'est pas une FK

n°1273793
Arjuna
Aircraft Ident.: F-MBSD
Posté le 27-12-2005 à 17:08:51  profilanswer
 

Wouala un exemple complet avec SQL Server 2000 :
La syntaxe peut varier légèrement.
 

Code :
  1. /****** Object:  Database test    Script Date: 12/27/2005 5:08:18 PM ******/
  2. CREATE DATABASE [test]  ON (NAME = N'test_Data', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL\data\test_Data.MDF' , SIZE = 1, FILEGROWTH = 10%) LOG ON (NAME = N'test_Log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL\data\test_Log.LDF' , SIZE = 1, FILEGROWTH = 10%)
  3. COLLATE French_CI_AS
  4. GO
  5. exec sp_dboption N'test', N'autoclose', N'false'
  6. GO
  7. exec sp_dboption N'test', N'bulkcopy', N'false'
  8. GO
  9. exec sp_dboption N'test', N'trunc. log', N'false'
  10. GO
  11. exec sp_dboption N'test', N'torn page detection', N'true'
  12. GO
  13. exec sp_dboption N'test', N'read only', N'false'
  14. GO
  15. exec sp_dboption N'test', N'dbo use', N'false'
  16. GO
  17. exec sp_dboption N'test', N'single', N'false'
  18. GO
  19. exec sp_dboption N'test', N'autoshrink', N'false'
  20. GO
  21. exec sp_dboption N'test', N'ANSI null default', N'false'
  22. GO
  23. exec sp_dboption N'test', N'recursive triggers', N'false'
  24. GO
  25. exec sp_dboption N'test', N'ANSI nulls', N'false'
  26. GO
  27. exec sp_dboption N'test', N'concat null yields null', N'false'
  28. GO
  29. exec sp_dboption N'test', N'cursor close on commit', N'false'
  30. GO
  31. exec sp_dboption N'test', N'default to local cursor', N'false'
  32. GO
  33. exec sp_dboption N'test', N'quoted identifier', N'false'
  34. GO
  35. exec sp_dboption N'test', N'ANSI warnings', N'false'
  36. GO
  37. exec sp_dboption N'test', N'auto create statistics', N'true'
  38. GO
  39. exec sp_dboption N'test', N'auto update statistics', N'true'
  40. GO
  41. if( (@@microsoftversion / power(2, 24) = 8) and (@@microsoftversion & 0xffff >= 724) )
  42. exec sp_dboption N'test', N'db chaining', N'false'
  43. GO
  44. use [test]
  45. GO
  46. /****** Object:  Login BUILTIN\Administrateurs    Script Date: 12/27/2005 5:08:18 PM ******/
  47. exec sp_addsrvrolemember N'BUILTIN\Administrateurs', sysadmin
  48. GO
  49. /****** Object:  User dbo    Script Date: 12/27/2005 5:08:18 PM ******/
  50. /****** Object:  Table [dbo].[commande]    Script Date: 12/27/2005 5:08:20 PM ******/
  51. CREATE TABLE [dbo].[commande] (
  52. [id] [numeric](18, 0) IDENTITY (1, 1) NOT NULL ,
  53. [reference] [varchar] (50) COLLATE French_CI_AS NOT NULL
  54. ) ON [PRIMARY]
  55. GO
  56. /****** Object:  Table [dbo].[cde_ligne]    Script Date: 12/27/2005 5:08:20 PM ******/
  57. CREATE TABLE [dbo].[cde_ligne] (
  58. [cde_id] [numeric](18, 0) NOT NULL ,
  59. [num_ligne] [numeric](18, 0) NOT NULL ,
  60. [pro_id] [numeric](18, 0) NOT NULL ,
  61. [quantite] [numeric](18, 0) NOT NULL
  62. ) ON [PRIMARY]
  63. GO
  64. ALTER TABLE [dbo].[commande] WITH NOCHECK ADD
  65. CONSTRAINT [PK_commande] PRIMARY KEY  CLUSTERED
  66. (
  67.  [id]
  68. )  ON [PRIMARY]
  69. GO
  70. ALTER TABLE [dbo].[cde_ligne] WITH NOCHECK ADD
  71. CONSTRAINT [PK_cde_ligne] PRIMARY KEY  CLUSTERED
  72. (
  73.  [cde_id],
  74.  [num_ligne]
  75. )  ON [PRIMARY]
  76. GO
  77. ALTER TABLE [dbo].[cde_ligne] ADD
  78. CONSTRAINT [FK_cde_ligne_commande] FOREIGN KEY
  79. (
  80.  [cde_id]
  81. ) REFERENCES [dbo].[commande] (
  82.  [id]
  83. ) ON DELETE CASCADE  ON UPDATE CASCADE
  84. GO


 
PS: la foreign key, c'est le dernier block :D


Message édité par Arjuna le 27-12-2005 à 17:11:03
mood
Publicité
Posté le 27-12-2005 à 17:08:51  profilanswer
 

n°1273919
Siron
Posté le 27-12-2005 à 23:46:00  profilanswer
 

Arjuna a écrit :

sinon, oui, tu ne te trompes pas, sauf que ce que tu as posté là haut, c'est pas une FK


 
 :sweat:   Je viens de voir ma bête erreur.  Noté primary au lieu de foreign.
 
Arjuna ==> comment noyer le facile dans du compliqué.

n°1273929
Arjuna
Aircraft Ident.: F-MBSD
Posté le 28-12-2005 à 01:11:48  profilanswer
 

:sol:

n°1273930
Arjuna
Aircraft Ident.: F-MBSD
Posté le 28-12-2005 à 01:12:14  profilanswer
 

ceci dit, je te le dis depuis le début que t'utilises pas le bon mot clé :o

n°1274404
Siron
Posté le 29-12-2005 à 13:39:52  profilanswer
 

Mais oui mais bon, j'avais pas capté la mega bourde, trop grosse a assumer inconciemment.


Message édité par Siron le 29-12-2005 à 13:40:04

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQL] Question sur foreign key

 

Sujets relatifs
[SQL] (noob) difference entre char et varchar[SQL/PHP] Selectionner toute les tables d'une base
Question sur deletenouvelle question linux...
ptite question linux[SQL SERVER 2000] Definir un ordre de priorité pour les bases??
question interface graphique[PL/SQL]
Question simple sur les DOUBLONS...quelques question ?
Plus de sujets relatifs à : [SQL] Question sur foreign key


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR