web-dev-qa-db-fra.com

One to Many MySQL

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.

17
Baub

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.

37
Johan

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)

7
Andreas Wederbrand