小编Hol*_*ler的帖子

为什么 PostgreSQL 允许外键中存在某些类型不匹配?

在教授数据库基础课程时,一名学生询问外键的数据类型与他们引用的事物(例如主键)的数据类型不匹配。

例如,可以存储在INTEGER列中的所有数字都可以表示为TEXT,因此只要应用适当的类型转换/转换,TEXT列的数据就可以用于引用列中的数据。INTEGER

我们在教学中使用 PostgreSQL(因为它的文档非常好等等),所以我们就去看了一下。你瞧,关于外键的“简化”章节告诉我们:

当然,受约束列的数量和类型需要与引用列的数量和类型相匹配。

不过,有关CREATE TABLE 的“功能完整”部分的进一步研究并未明确提及数据类型。这部分只讲价值观。

我们尝试了各种数据类型的组合,其中一些比其他组合更有说服力(例如上面的INTEGER-变体)。TEXTDBMS 不相信并回复42804:不兼容的类型。

到目前为止,一切都很好。想象一下,当我们发现 PostgreSQL 的各种整数类型实际上可以工作时,我们会多么惊讶。

他们甚至正确地考虑了符号,这意味着他们不仅仅是匹配位。

当然,这应该有一个方向:拥有一个由列INTEGER引用的列BIGINT总是有效的,因为适合引用列的所有内容也适合引用列。

令人惊讶的是,PostgreSQL 允许另一个方向(在本例中使用INTEGERSMALLINT):

CREATE TABLE this_should_not_work
(
    this_should_not_work_id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    data                    TEXT
);

CREATE TABLE this_should_not_work_detail
(
    detail_id                  INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    detail_data                TEXT,
  
  -- This Foreign Key references a column of …
Run Code Online (Sandbox Code Playgroud)

postgresql foreign-key datatypes

14
推荐指数
1
解决办法
2920
查看次数

标签 统计

datatypes ×1

foreign-key ×1

postgresql ×1