[SQL] Question sur foreign key

Question sur foreign key [SQL] - SQL/NoSQL - Programmation

Marsh Posté le 27-12-2005 à 11:52:27    

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
Reply

Marsh Posté le 27-12-2005 à 11:52:27   

Reply

Marsh Posté le 27-12-2005 à 11:58:25    

à 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...

Reply

Marsh Posté le 27-12-2005 à 11:59:24    

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
Reply

Marsh Posté le 27-12-2005 à 12:34:02    

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".

Reply

Marsh Posté le 27-12-2005 à 12:42:16    

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
Reply

Marsh Posté le 27-12-2005 à 12:42:41    

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

Reply

Marsh Posté le 27-12-2005 à 16:32:26    

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.

Reply

Marsh Posté le 27-12-2005 à 17:04:41    

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

Reply

Marsh Posté le 27-12-2005 à 17:05:21    

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

Reply

Marsh Posté le 27-12-2005 à 17:08:51    

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
Reply

Marsh Posté le 27-12-2005 à 17:08:51   

Reply

Marsh Posté le 27-12-2005 à 23:46:00    

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é.

Reply

Marsh Posté le 28-12-2005 à 01:11:48    

:sol:

Reply

Marsh Posté le 28-12-2005 à 01:12:14    

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

Reply

Marsh Posté le 29-12-2005 à 13:39:52    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed