0

将单个表拆分为多个表时,外键指的是来自不同行的主键是否很常见?
例如
源表数据是

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

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

4

2 回答 2

2

首先回答您提出的问题:

是的,当您将一个表拆分为两个(或更多)时,您会看到不同行中的数据。这就是事情的本来面目™。原始数据是表中的哪一行或新数据是表中的哪一行都没有关系。行号与您的数据无关,这只是它的显示方式。例如,您可以pk_table像这样创建新的:

id1 name1
1   a15
3   a14
8   a12
9   a11
10  a10

它不会有任何区别。

其次,这涉及其他人试图告诉你的内容。您将原始表转换为两个辅助表的方式不会为您提供数据库。您为创建fk_tablea) 提供的语法没有意义,并且 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记录的查询

于 2013-04-04T15:52:16.230 回答
0

拆分表的方式不遵循规范化标准。源表中的字段之间没有(可见的)功能依赖关系。其次,您的表甚至不共享 PK-FK 关系。您的问题毫无意义,因为您使用 PK-FK 拆分表的假设是不正确的。

于 2013-04-04T13:57:48.763 回答