私はこれらのテーブルを持っています:
create table person (
person_id int unsigned auto_increment,
person_key varchar(40) not null,
primary key (person_id),
constraint uc_person_key unique (person_key)
)
-- person_key is a varchar(40) that identifies an individual, unique
-- person in the initial data that is imported from a CSV file to this table
create table marathon (
marathon_id int unsigned auto_increment,
marathon_name varchar(60) not null,
primary key (marathon_id)
)
create table person_marathon (
person_marathon _id int unsigned auto_increment,
person_id int unsigned,
marathon_id int unsigned,
primary key (person_marathon_id),
foreign key person_id references person (person_id),
foreign key marathon_id references person (marathon_id),
constraint uc_marathon_person unique (person_id, marathon_id)
)
Person テーブルは、約 130,000 行を含む CSV によって設定されます。この CSV には、各個人の一意の varchar(40) とその他の個人データが含まれています。CSV に ID はありません。
マラソンごとに、1,000 ~ 30,000 人のリストを含む CSV を取得します。CSV には、基本的にperson_key
、特定のマラソンに参加した人々を示す値のリストだけが含まれています。
person_marathon
FK 関係を維持するためにデータをテーブルにインポートする最良の方法は何ですか?
これらは私が現在考えることができるアイデアです:
テーブルに挿入する前に、MySQL から情報を引き出し、PHP でデータをマージしてそこに取得し
person_id + person_key
ます。person_marathon
person_id
person_marathon
挿入には一時テーブルを使用してください...しかし、これは仕事のためであり、この特定のデータベースでは決して一時テーブルを使用しないように求められました
a はまったく使用せず、フィールドのみを使用しますが、a に参加する必要が
person_id
あり、通常は良いことではありません。person_key
varchar(40)
または、挿入の場合は、次のようにします(挿入する必要がありました。
<hr>
そうしないと、挿入全体がコードとしてフォーマットされません)。insert into person_marathon select p.person_id, m.marathon_id from ( select 'person_a' as p_name, 'marathon_a' as m_name union select 'person_b' as p_name, 'marathon_a' as m_name ) as imported_marathon_person_list join person p on p.person_name = imported_marathon_person_list.p_name join marathon m on m.marathon_name = imported_marathon_person_list.m_name
その挿入の問題は、PHP でビルドすると、簡単に 30,000アイテム
imported_marathon_person_list
になる可能性があるため、巨大になることです。select union
しかし、他にどのようにすればよいかわかりません。