6

我在 Oracle 中遇到了我认为奇怪的行为

可以创建列大小与参考列大小不匹配的外键,这似乎不正确。当然,数据库应该强制匹配列大小,我在这里遗漏了什么吗?

我相当确定 MySQL 不允许这样做

SQL> create table parent(col1 varchar2(255) primary key);
Table created.
SQL> create table child(col1 varchar2(20) primary key, constraint col1_fk foreign key (col1)
references parent(col1));
Table created.
4

2 回答 2

9

如果 FK 在数据类型和大小上都匹配当然是首选,但有时它可能不实用(甚至是一个好主意)。在上述情况下,PK 较大,因此这不会导致第二个表的数据输入出现问题,因为它们只会输入 50 个字符或更少的字符(在子表字段较大的情况下进行反向操作将毫无意义sa 你永远不能输入大于 PK 的数据)。根据第一个表中的数据,这实际上可能会阻止您从原始表中输入您不希望 FK 输入的值。但是,如果您想链接到 118 个字符长的 PK 记录,您将遇到问题。

让我们看看一个表的情况,该表最初设计不佳,字段太大,历史上有些数据我们想要保留,但不会链接到任何新表中。也许我们现在通过触发器或约束或通过应用程序来强制执行较小的大小。在一个新的子表中,我们只希望能够连接到与当前需求匹配的记录,并且永远不需要连接到较旧的较长记录。在这种情况下,将第二个表设计为仅采用较小的长度是一个好主意。

在某些情况下,初始表可能包含不同类型的数据(例如键值存储),并且子表可能只想链接到一种类型,并且该类型的长度小于父表中允许的长度。不同的类型。再次使用较小的长度将是一件好事。

我想像这样的场景就是允许它的原因。然而,仅仅因为某些东西是被允许的,并不能使它成为最佳实践。如果我正在创建一个表并且我没有特定的理由说明该字段应该不同,那么我将创建它们相同。就像游标一样,它们存在于特定的用例中,但它们可以用于其他不是最佳选择的情况。数据库设计涉及知道如何确定最佳方法,而不仅仅是依赖于某事是可能的事实。

于 2013-08-22T13:55:05.197 回答
0

主键列的大小更高,所以理论上它不应该产生任何问题。

但是当条件是其他方式时,例如主键大小较小,则会造成麻烦。

但最好的方法应该是相同的数据类型和大小。

于 2013-08-22T13:59:35.377 回答