Postgresql Postgres FK声明引用客户名称而不是类型?

Postgresql Postgres FK声明引用客户名称而不是类型?,postgresql,types,foreign-keys,pgadmin,Postgresql,Types,Foreign Keys,Pgadmin,我不太使用Postgres(我曾经使用其他数据库),所以最近我在pgAdmin中查看一个数据库,看到一个奇怪的模式语法,我在文档中找不到任何东西,我想了解一下: 所以我看到这个语法: CREATE TABLE table1 ( table1_id serial NOT NULL, table2_fk_id t2_id NOT NULL, -- what is this line? ... CONSTRAINT fk_table2_chm FOREIGN KEY (table2_f

我不太使用Postgres(我曾经使用其他数据库),所以最近我在pgAdmin中查看一个数据库,看到一个奇怪的模式语法,我在文档中找不到任何东西,我想了解一下:

所以我看到这个语法:

CREATE TABLE table1
(
  table1_id serial NOT NULL,
  table2_fk_id t2_id NOT NULL, -- what is this line?
  ...
  CONSTRAINT fk_table2_chm FOREIGN KEY (table2_fk_id)
      REFERENCES table2 (t2_id_col) MATCH SIMPLE
      ON UPDATE RESTRICT ON DELETE RESTRICT
);
创建表表1
(
表1\u id序列号不为空,
表2\u fk\u id t2\u id非空,--这一行是什么?
...
约束fk_table2_chm外键(table2_fk_id)
参考文献表2(t2\u id\u col)匹配简单
更新时限制删除时限制
);
上面那条划线是什么?它似乎是外键col,而不是指定int/int8,它指定的是自定义名称
t2\u id

而在
表2中
pk列中,上面引用的是
serial
类型,标记为
t2\u id\u col

这是什么奇怪的语法吗?或与pgAdmin相关的内容?

要确定,请运行:

SELECT *
FROM   pg_type
WHERE  typname = 't2_id'
如果
typtype
d
它是一个域,用创建。
或者在pgAdmin中,只需检查“对象浏览器”中的域列表

是的,这在某种程度上与pgAdmin有关,因为它可以礼貌地显示一个列
serial
不是实际类型,基础类型是
integer
。因此,您的域类型必须基于
integer
以及允许外键,这需要匹配的基类型。详细信息:

t2\u id
可以是用户定义的类型或域。您添加了
**
还是在原始代码中?因为这只是一个语法错误……不,抱歉,这只是为了突出显示该行,我已将其删除以避免混淆如果
t2\u id
是以
int
为基类型的域,则外键约束仍然有效。请纠正问题中误导性的例子。这不是异国情调,只是你不熟悉<代码>创建域
至少从SQL-92开始就成为SQL标准的一部分,除MySQL之外的所有主要SQL dbms都支持它。