web-dev-qa-db-ja.com

1対多のMySQL

可能性のある複製:
MySQL関係

MySQLで外部キーを使用して1対多の関係を作成しようとしています。

2つのテーブル、userおよびlocation。各userには多数のlocationを含めることができますが、各locationに含めることができるuserは1つだけです。

これをどのように構成しますか?それが役立つ場合は、HeidiSQLを使用していますが、コードを入力することもできます。

17
Baub

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 -> manymany <- 1の関係の方向は、リンクフィールドの場所によって決まります。

通常、すべてのテーブルには一意のidがあり、リンクフィールドはtablename_idと呼ばれます。
リンクフィールドが含まれるテーブルはリレーションシップのmany側であり、他のテーブルは1側にあります。

各ユーザーは多くの場所を持つことができますが、各場所は1人のユーザーしか持つことができません。

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

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

リンクフィールドをlocationテーブルに配置することで、場所に1人のユーザーしか設定できないように強制できます。ただし、ユーザーは多くの場所を持つことができます。

37
Johan

ここには、ほぼ正確に必要な例があります 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;

この例では、ユーザーは親と同じで(ユーザーには多くの場所があり、親には多くの子供がいます)、場所は子供と同じです(場所には1人のユーザーがいて、子供には1人の親があります)

7