我正在尝试使用MySQL Workbench首次设置数据库。我有3个csv文件:parent.csv
,child.csv
,parent_to_child.csv
。 parent.csv
和child.csv
文件只包含1列,其中包含许多行(50,000+)个唯一字符串标识符(字母数字)。
parent.csv
parent_id
parent001
parent002
parent003
parent004
...
child.csv
child_id
child001
child002
child003
child004
...
到目前为止,我设法使用代理自动增量主键(整数)创建parent
和child
表。
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
引用其parent
。 child
到parent
映射存储在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
,因为@col1
是parent_id
(字符串),而不是父项的id_num
(int)。
所以我认为我的主要问题是弄清楚如何从id_num
表格中的parent_id
获取parent
,然后将id_num
分配给id_num_parent
{ {1}}表格中的{1}}。
答案 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中的标识列。
所以你有两个选择:
使用auto_increment或
使用父级和子级ID创建代理键
然后使用parent_to_child表创建这些字段的引用。