我有这些表:
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。
对于每场马拉松比赛,我都会得到一个 CSV,其中包含 1k - 30k 人的列表。CSV 基本上只包含一个person_key
值列表,显示哪些人参加了特定的马拉松比赛。
将数据导入person_marathon
表以维护 FK 关系的最佳方法是什么?
这些是我目前能想到的想法:
从MySQL中提取信息并在 PHP 中
person_id + person_key
合并数据以在插入表之前将其放入其中person_marathon
person_id
person_marathon
使用临时表进行插入...但这是为了工作,我被要求永远不要在这个特定数据库中使用临时表
根本不使用 a
person_id
,只使用该person_key
字段,但随后我将不得不加入 avarchar(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 构建它
imported_marathon_person_list
会很大,因为它很容易有 30,000select union
个项目。不过,我不知道该怎么做。