Rechercher : dans
Par :

[probleme SQL]Clé primaire clé etrangere

Dernière réponse le 14 mai 2008 à 15:09:04 kyky, le 27 nov 2007 à 22:29:00 
 Signaler ce message aux modérateurs

Bonjour,
voila je doit creer un site internet et stocké par exemple mes articles etc dans une table donc j'ai 4tables

une table membres ,articles,horaires,etat civil

membres:
nom
prenom
mot de passe(pour moi clé primaire)
nom d'usage
adresse telephone
e-mail


articles
nombre article
code article
titre
text_article
auteur


horaires
nombre d'office
nom de loffice
heure ouverture
heure fermeture
gerant
telephone

etat civil( pas la peine de l'expliquer car ce sera une partie visible meme au non inscrit )


donc le principe c'est si une personne est inscrite via le site elle peut acceder au horaires et articles mais je ne voi pas trop comment lié les tables
est il possible de prendre par exemple l'attributs mot de passe de membres et le definir a la fois clé etrangere de articles et horaires? je boss actuellement sur easy php donc si vous avez une autre solution pourriez vous m'aider si possible me donner le morceau de la requete correspondant


merci bocoup

Configuration: Windows XP
Internet Explorer 6.0

Meilleures réponses pour « [probleme SQL]Clé primaire clé etrangere » dans :
Duplicate entry '127' for key 1 VoirVous tentez de faire une insertion dans une table de votre base de données MySQL et vous obtenez l'erreur MySQL suivante: Duplicate entry '127' for key 1 Ceci provient très probablement du fait que la clé primaire de votre table est de type TINYINT...
SQL - Contraintes d'intégrité VoirExpression de contraintes d'intégrité Une contrainte d'intégrité est une clause permettant de contraindre la modification de tables, faite par l'intermédiaire de requêtes d'utilisateurs, afin que les données saisies dans la base soient...
SQL - Création d'index VoirQu'est-ce qu'un index? Un index est un objet complémentaire (mais non indispensable) à la base de données permettant d'"indexer" certaines colonnes dans le but d'améliorer l'accès aux données par le SGBDR, au même titre qu'un index dans un livre ne...
Oracle - Les séquences VoirCet article s'appuie sur la version 8.1.6 d'Oracle. Une séquence est un objet de base de données Oracle, au même titre qu'une table, une vue, etc... Autrement dit, il appartient à un utilisateur, on peut le manipuler, le modifier, à condition...

1

PPBoyington, le 27 nov 2007 à 22:57:28

Je n'ai pas trop compris le but de tes tables mais mettre un mot de passe comme clé c'est une horreur...deja un mot de passe ca se change alors tu ne va pas te mettre a changer ta clé primaire,ensuite tu as toutes les chances d'avoir des doublons avec les mots de passe. Tu pourrais prendre nom+prénom comme clé ou bien créer une clé aléatoire, pour articles et horaires aussi (ca peut etre un bête numéro d'ordre)

Répondre à PPBoyington

2

kyky, le 27 nov 2007 à 23:55:40

Et bien je dois stockés toutes les informations de mon site en plus des inscriptions dans des tables donc c'est un site sur mon villages ou les personnes inscritents pourront si il sont authentifier consulter les horaires d'ouverture de la mairie par exemple ou meme consulter les articles.
donc c'est surtout pour dire que si les personne est logger et si le mot de passe figure bien dans la base donc afficher par exemple l'article

merci de m'eclairer

Répondre à kyky

3

bil808, le 28 nov 2007 à 03:57:40
  • +4

Bonjour
enfaite t'as 4 entité membres , articles ,horaires ,etat civil ;
chaque entité va etre représenté par une table dans t'as base

la clé primaire d'une table doit étre unique et non null ;

or si tu choisis par exemple dans la table membres le nom d'un membre comme clé primaire
tu risque de violé l'unicité de la clé car 2 membres peuvent avoir le méme nom ; pour eviter ça il faut que tu ajoute un champ dans t'as table membres ,

"idmembre" par exemple qui sera de type int tu le définie avec un AUTO_INCREMENT (donc c'est un champ qui v'as etre incrementé à chaque insertion d'un nouveau membre dans la table membres ) avec ce champ on a assosier a chaque membre un numéro unique non null
. donc idmembre poura bien etre une clé primaire .

CREATE TABLE `membre` (
`idmembre ` INT( 6 ) NOT NULL AUTO_INCREMENT ,
`nom` VARCHAR( 25 ) NOT NULL ,
`prenom` VARCHAR( 25 ) NOT NULL ,
`motpasse` VARCHAR( 30 ) NOT NULL ,
`nomusage` VARCHAR( 30 ) NOT NULL ,
`telephone` INT( 10 ) NOT NULL ,
`email` VARCHAR( 50 ) NOT NULL ,
PRIMARY KEY ( `idmembre ` )
) TYPE=INNODB;

pareil pour la table articles il te faut aussi un idarticles comme clé primaire


CREATE TABLE `articles` (
`idarticle ` INT( 6 ) NOT NULL AUTO_INCREMENT ,
`nombrearticle` VARCHAR( 25 ) NOT NULL ,
`codearticle` INT( 25 ) NOT NULL ,
`titre` VARCHAR( 30 ) NOT NULL ,
`text_article` VARCHAR( 30 ) NOT NULL ,
`auteur ` INT( 10 ) NOT NULL ,

PRIMARY KEY ( `idarticle ` )
) TYPE=INNODB;

maintenant tu dois lier tes tables par des relation
tu commencer par definir la relation entre les tables .

dans notre exemple

1)on commence par definir la relation entre les tables membres et articles ,

un client consulte un article

on voit bien que la relation "consulte " est une relation (n-n) ou (plusieurs-plusieurs) car un client peut consulter 0,1 ou plusieurs articles , et un article peut etre consulter par 0,1,ou plusieurs clients


2) il faut traduire la relation

la traduction d'une relation n-n
donne une table dont la clef primaire et l'union des clefs primaire des class d'entités (membres et articles dans notre exemple )

donc la liaison entre un membre et un article vas etre assurer par une table nommé consulte .

CREATE TABLE `consulte` (
`idmembre ` INT( 6 ) NOT NULL,
`idarticle ` INT( 6 ) NOT NULL ,
PRIMARY KEY ( `idmembre ` ,`idarticle ` )

INDEX (idmembre),
FOREIGN KEY (idmembre)
REFERENCES membres(idmembre)
INDEX (idarticle),
FOREIGN KEY (idarticle)
REFERENCES articles(idarticle)
)


explication :
FOREIGN KEY (idmembre)
REFERENCES membres(idmembre)
INDEX (idarticle),
FOREIGN KEY (idarticle)
REFERENCES articles(idarticle)

idmembre , idarticle sont une clé primaires dans la table consulte mais (on peut les considérer comme clé etrangere ) car il sont des clé dans d'autres table (membres,articles).

c'est pour ça qu' on est obliger de mentioner la reference à ces tables .




j'espaire que j'etais claire a+
bil808@yahoo.fr

Répondre à bil808

8

kimo75, le 14 mai 2008 à 14:31:09

Salut et merci pour votre explication mais il me reste une petite explication c comme exécuté ce script a partir de dream weaver
j fait :
require("connexion.php");
$req="CREATE TABLE `consulte`(
ben vous connaissez la suite..;)type=innodb;
comment faire !!! Merci d'avance

Répondre à kimo75

9

 kimo75, le 14 mai 2008 à 15:09:04

Est ce que ce script est logique sa marche mais j doute /
<?php
$db=mysql_connect("localhost", "root", "");
mysql_select_db("projet",$db);

mysql_query("CREATE TABLE `consulter` (
`id_client` INT( 50 ) NOT NULL ,
`code_roule` VARCHAR( 50) NOT NULL ,
INDEX ( `id_client` ) ,
FOREIGN KEY ( `id_client` ) REFERENCES `client` ( `id_client` ) ,
INDEX ( `code_roule` ) ,
FOREIGN KEY ( `code_roule` ) REFERENCES `roule` ( `code_roule` )
) TYPE = InnoDB");
?>

Répondre à kimo75

4

kyky, le 28 nov 2007 à 10:00:31

Je vous remercie mais je suis obliger de refaire une autre table consulte 2 pour faire le lien entre membres et horaires car il s'agit encore d'une relation (n,n)?
donc je peut reprendre encore une fois idmembre et idhoraires comme clé de idconsulte2?

Répondre à kyky

5

kyky, le 28 nov 2007 à 13:02:19

CREATE TABLE `membre` (
`idmembre ` INT( 6 ) NOT NULL AUTO_INCREMENT ,
`nom` VARCHAR( 25 ) NOT NULL ,
`prenom` VARCHAR( 25 ) NOT NULL ,
`motpasse` VARCHAR( 30 ) NOT NULL ,
`nomusage` VARCHAR( 30 ) NOT NULL ,
`telephone` INT( 10 ) NOT NULL ,
`email` VARCHAR( 50 ) NOT NULL ,
PRIMARY KEY ( `idmembre ` )
) TYPE=INNODB;



CREATE TABLE `articles` (
`idarticle ` INT( 6 ) NOT NULL AUTO_INCREMENT ,
`nombrearticle` INT( 6 ) NOT NULL ,
`codearticle` INT( 25 ) NOT NULL ,
`titre` VARCHAR( 30 ) NOT NULL ,
`text_article` VARCHAR( 3000 ) NOT NULL ,
`auteur ` VARCHAR( 25 ) NOT NULL ,

PRIMARY KEY ( `idarticle ` )
) TYPE=INNODB;

CREATE TABLE `horaires` (

`idhoraires` INT( 6 ) NOT NULL AUTO_INCREMENT ,
`nombre_office` INT( 6 ) NOT NULL ,
`code_office` INT( 10 ) NOT NULL ,
`nom_office` VARCHAR( 30 ) NOT NULL ,
`description_office` VARCHAR( 300 ) NOT NULL ,
`gerant_office` VARCHAR( 30 ) NOT NULL ,
`ouverture_office` VARCHAR( 30 ) NOT NULL ,
`fermeture_office` VARCHAR( 30 ) NOT NULL ,
`telephone_office` VARCHAR( 15 ) NOT NULL ,
PRIMARY KEY ( `idhoraires` )
) TYPE=INNODB;


CREATE TABLE `consulte_article` (

`idmembre` INT( 6 ) NOT NULL ,
`idarticle` INT( 6 ) NOT NULL ,
PRIMARY KEY ( `idmembre` , `idarticle` ) ,

INDEX ( `idmembre` ) ,
FOREIGN KEY ( `idmembre` ) REFERENCES `membre` ( `idmembre` ) ,
INDEX ( `idarticle` ) ,
FOREIGN KEY ( `idarticle` ) REFERENCES `articles` ( `idarticle` )
) TYPE = InnoDB



CREATE TABLE `consulte_horaires` (

`idmembre` INT( 6 ) NOT NULL ,
`idhoraires` INT( 6 ) NOT NULL ,
PRIMARY KEY ( `idmembre` , `idhoraires` ) ,

INDEX ( `idmembre` ) ,
FOREIGN KEY ( `idmembre` ) REFERENCES `membre` ( `idmembre` ) ,
INDEX ( `idhoraires` ) ,
FOREIGN KEY ( `idhoraires` ) REFERENCES `horaires` ( `idhoraires` )
) TYPE = InnoDB


voila j'ai donc creer mes tables sous mysql merci ^^
c'est resolu

Répondre à kyky

6

bil808, le 2 déc 2007 à 03:12:37

De rien kyky ;)

Répondre à bil808

7

bil808, le 3 déc 2007 à 21:54:26
  • +5

Kyky si c'est résolu donc change le staut de sujet (résolut)

Répondre à bil808