在教授数据库基础课程时,一名学生询问外键的数据类型与他们引用的事物(例如主键)的数据类型不匹配。
例如,可以存储在INTEGER
列中的所有数字都可以表示为TEXT
,因此只要应用适当的类型转换/转换,TEXT
列的数据就可以用于引用列中的数据。INTEGER
我们在教学中使用 PostgreSQL(因为它的文档非常好等等),所以我们就去看了一下。你瞧,关于外键的“简化”章节告诉我们:
当然,受约束列的数量和类型需要与引用列的数量和类型相匹配。
不过,有关CREATE TABLE 的“功能完整”部分的进一步研究并未明确提及数据类型。这部分只讲价值观。
我们尝试了各种数据类型的组合,其中一些比其他组合更有说服力(例如上面的INTEGER
-变体)。TEXT
DBMS 不相信并回复42804
:不兼容的类型。
到目前为止,一切都很好。想象一下,当我们发现 PostgreSQL 的各种整数类型实际上可以工作时,我们会多么惊讶。
他们甚至正确地考虑了符号,这意味着他们不仅仅是匹配位。
当然,这应该有一个方向:拥有一个由列INTEGER
引用的列BIGINT
总是有效的,因为适合引用列的所有内容也适合引用列。
令人惊讶的是,PostgreSQL 允许另一个方向(在本例中使用INTEGER
和SMALLINT
):
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)