Подтвердить что ты не робот

От одного до многих MySQL

Возможный дубликат:
Отношения MySQL

Я пытаюсь создать отношения от одного до многих в MySQL с внешними ключами.

Две таблицы, user и location. Каждый user может иметь много location s, но каждый location может иметь только один user.

Как мне настроить это? Я использую HeidiSQL, если это помогает, хотя я также могу ввести код.

4b9b3361

Ответ 1

MySQL не знает, и не нужно знать, имеет ли отношение 1-1 или 1-много.
Нет SQL поддерживает много-много отношений, все требуют промежуточной таблицы, которая разделяет много-много отношений на 2 отдельных 1-много.

Разница заключается в логике, которая управляет отношениями, которые находятся в коде, который вы пишете. Отношение 1-1 поддерживается тем, что таблицы имеют один и тот же первичный ключ.
С помощью вторичной таблицы, объявляющей, что PK как внешний ключ указывает на другие таблицы PK.

Table chinese_mother (
id integer primary key,
name....


Table chinese_child (
id integer primary key,
name ....
....,
foreign key (id) references chinese_mother.id

Направление отношения 1 -> many vs many <- 1 определяется расположением поля ссылки.

Обычно каждая таблица имеет уникальный id, а поле ссылки называется tablename_id.
Таблица, в которой есть поле ссылки, является стороной many отношения, другая таблица находится на стороне 1.

Каждый пользователь может иметь много местоположений, но в каждом местоположении может быть только один пользователь.

Table user
id: primary key
name......
.....

Table location
id: primary key
user_id foreign key references (user.id)
x
y
.......

Поместив поле ссылки в таблицу location, вы заставляете вещи так, чтобы в местоположении могло быть только 1 пользователь. Однако у пользователя может быть много мест.

Ответ 2

Вот пример: почти что вам нужно внешние ключи в 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;

В вашем примере пользователь совпадает с родительским (у пользователя много мест, у родителя много дочерних элементов), а местоположение совпадает с дочерним (у одного пользователя есть один ребенок, у одного родителя есть)