将单个表拆分为多个时,外键是指不同行的主键是常见的情况吗?
例如
源表数据为
id1 id2 name1 name2
10 1 a10 b1
9 8 a11 b2
8 3 a12 b3
3 9 a14 b4
1 10 a15 b5
所以当我创建主键表为
时 create table pk_table (id1 integer primary key , name1 varchar2(20))
和外键表
create table fk_table (id2 integer, name2 varchar2(20) foreign key(id2) references pk_table(id1))
所以当我按照表格分割数据时:
pk_table数据是:
id1 name1
10 a10
9 a11
8 a12
3 a14
1 a15
和外键数据是
id2 name2
1 b1
8 b2
3 b3
9 b4
10 b5
那么你看到我们没有fk引用源表中的同一行pk的情况吗?
已编辑:更新了表格数据,使其更有效。
答案 0 :(得分:2)
首先回答你提出的问题:
是的,当您将一个表拆分为两个(或更多)时,您会看到不同行中的数据。这就是假设要做的事情。表中原始数据的哪一行或新数据都无关紧要。行号与您的数据有 nothing ,这就是它自己显示的方式。例如,您可以像这样创建新的pk_table
:
id1 name1
1 a15
3 a14
8 a12
9 a11
10 a10
并没有任何区别。
其次,这涉及其他人试图告诉你的内容。您将原始表转换为两个辅助表的方式不会为您提供数据库。您为创建fk_table
a)提供的语法没有意义,并且b)不起作用。
分割表时需要做的是在fk_table
中创建一个包含pk_table
主键的新列。这个额外列是告诉数据库fk_table
中哪条记录匹配pk_table
中哪条记录的链接。回到原始问题,这个链接就是为什么旧记录或新记录存在于哪一行没有区别的原因。重要的是fk_table
中的外键列。
为了切实可行,新表应该看起来更像这样:
pk_table - id1
是主键:
id1 name1
10 a10
9 a11
8 a12
3 a14
1 a15
fk_table - id2
是主键,fk_id1
是pk_table
的外键:
id2 name2 fk_id1
1 b1 10
8 b2 9
3 b3 8
9 b4 3
10 b5 1
使用此结构,您可以运行将每个pk_table
记录正确链接到正确的fk_table
记录的查询
答案 1 :(得分:0)
分割表格的方式不符合规范化标准。源表中的字段之间没有(可见的)功能依赖性。其次,你的表甚至不共享PK-FK关系。你的问题毫无意义,因为你假设你用PK-FK分割表是不正确的。