可能性のある複製:
MySQL関係
MySQLで外部キーを使用して1対多の関係を作成しようとしています。
2つのテーブル、user
およびlocation
。各user
には多数のlocation
を含めることができますが、各location
に含めることができるuser
は1つだけです。
これをどのように構成しますか?それが役立つ場合は、HeidiSQLを使用していますが、コードを入力することもできます。
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
とmany <- 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人のユーザーしか設定できないように強制できます。ただし、ユーザーは多くの場所を持つことができます。
ここには、ほぼ正確に必要な例があります 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人の親があります)