如何从csv文件中将外键分配给MySQL表?

时间:2015-12-12 01:59:32

标签: mysql sql database csv

我正在尝试使用MySQL Workbench首次设置数据库。我有3个csv文件:parent.csvchild.csvparent_to_child.csvparent.csvchild.csv文件只包含1列,其中包含许多行(50,000+)个唯一字符串标识符(字母数字)。

parent.csv

parent_id
parent001
parent002
parent003
parent004
...

child.csv

child_id
child001
child002
child003
child004
...

到目前为止,我设法使用代理自动增量主键(整数)创建parentchild表。

parent

id_num parent_id
1      parent001
2      parent002
3      parent003
4      parent004
...    ...

child

id_num child_id
1      child001
2      child002
3      child003
4      child004
5      child005
...    ...

我现在希望表格中的每个child引用其parentchildparent映射存储在parent_to_child.csv

parent_to_child.csv

parent_id, child_id
parent001, child004
parent001, child003
parent002, child005
parent003, child001
parent003, child002
...      , ...

所以期望的结果将是:

child表,其中id_num_parent是引用parent表的外键

id_num child_id id_num_parent
1      child001 2
2      child002 3
3      child003 1
4      child004 1
5      child005 2
...    ...      ...

所以我的方法是改变child表以包含一个新的id_num_parent,它将是一个引用parent表的外键列。然后,我可以使用parent_to_child.csv为每个child_id分配外键。

这是我失败的尝试:

LOAD DATA LOCAL INFILE 'parent_to_child.csv'
REPLACE
INTO TABLE child
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(@col1, @col2) set child_id=@col2, id_num_parent=@col1;

这会返回Incorrect integer value,因为@col1parent_id(字符串),而不是父项的id_num(int)。

所以我认为我的主要问题是弄清楚如何从id_num表格中的parent_id获取parent,然后将id_num分配给id_num_parent { {1}}表格中的{1}}。

3 个答案:

答案 0 :(得分:1)

如果你真的想要拥有两种实体类型和多对多关联的结构:在获得带有自动增量id的父表和子表之后,暂时将parent_child读入数据库,在child_ids和parent_ids上加入所有三个,然后选择child id_num,child_id& id_num_parent成永久表。

答案 1 :(得分:0)

您应该只删除列数据中的额外字符,例如父母' &安培; '儿童'因为已经通过单独的表区分。

因此,请创建更新查询以删除这些字符并仅保留数值。然后将列数据类型更改为int

查询如下:

Update parent set parent_id = substr(parent_id,9,1)

答案 2 :(得分:0)

主键是对列或列集的特殊约束。主键约束确保如此指定的列没有NULL值,并且每个值都是唯一的。物理上,主键由数据库系统使用唯一索引实现,并且主键中的所有列必须已声明为NOT NULL。一个表可能只有一个主键,但它可能是复合的(由多个列组成)。

代理键是可以声明为主键而不是“真实”或自然键的任何列或列集。有时候可以有几个自然键可以被声明为主键,这些都被称为候选键。因此,代理人是候选人的关键。一个表实际上可以有多个代理键,尽管这很不寻常。最常见的代理键类型是递增整数,例如MySQL中的auto_increment列,或Oracle中的序列,或SQL Server中的标识列。

所以你有两个选择:

  1. 使用auto_increment或

  2. 创建代理键
  3. 使用父级和子级ID创建代理键

  4. 然后使用parent_to_child表创建这些字段的引用。