Duplicata possible:
Relations MySQL
J'essaie de créer une relation un à plusieurs dans MySQL avec des clés étrangères.
Deux tables, user
et location
. Chaque user
peut avoir plusieurs location
, mais chaque location
ne peut avoir qu'un user
.
Comment configurer cela? J'utilise HeidiSQL si cela aide, bien que je puisse également entrer du code.
MySQL ne sait pas, ni n'a besoin de savoir si une relation est 1-1 ou 1-plusieurs.
Aucun SQL ne prend en charge les relations plusieurs-plusieurs, tous nécessitent une table intermédiaire qui divise une relation plusieurs-plusieurs en 2 1-plusieurs distincts.
La différence réside dans la logique qui contrôle les relations, qui se trouve dans le code que vous écrivez.
Une relation 1-1 est maintenue lorsque les tables partagent la même clé primaire.
Avec la table secondaire déclarant que PK en tant que clé étrangère pointant vers les autres tables PK.
Table chinese_mother (
id integer primary key,
name....
Table chinese_child (
id integer primary key,
name ....
....,
foreign key (id) references chinese_mother.id
La direction de la relation 1 -> many
contre many <- 1
est déterminé par l'emplacement du champ de lien.
Habituellement, chaque table a un id
unique et le champ de lien est appelé tablename_id
.
La table qui contient le champ de lien est le côté many
de la relation, l'autre table est sur le 1
côté.
Chaque utilisateur peut avoir plusieurs emplacements, mais chaque emplacement ne peut avoir qu'un seul utilisateur.
Table user
id: primary key
name......
.....
Table location
id: primary key
user_id foreign key references (user.id)
x
y
.......
En plaçant le champ de lien dans la table location
, vous forcez les choses pour qu'un emplacement ne puisse avoir qu'un seul utilisateur. Cependant, un utilisateur peut avoir plusieurs emplacements.
Il y a un exemple ici qui est presque exactement ce dont vous avez besoin clés étrangères dans innodb
CREATE TABLE parent (
id INT NOT NULL,
PRIMARY KEY (id)
) ENGINE=INNODB;
CREATE TABLE child (
id INT,
parent_id INT,
INDEX par_ind (parent_id),
FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE
) ENGINE=INNODB;
Dans votre exemple, l'utilisateur est le même que le parent (un utilisateur a plusieurs emplacements, un parent a plusieurs enfants) et l'emplacement est le même que l'enfant (un emplacement a un utilisateur, un enfant a un parent)