跨行的fk pk关系

时间:2013-04-04 13:33:09

标签: sql primary-key foreign-key-relationship split

将单个表拆分为多个时,外键是指不同行的主键是常见的情况吗? 例如
源表数据为

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的情况吗?

已编辑:更新了表格数据,使其更有效。

2 个答案:

答案 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_id1pk_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分割表是不正确的。

相关问题