【问题标题】:Postgres FK declaration references customer name rather than type?Postgres FK 声明引用客户名称而不是类型?
【发布时间】:2014-07-14 16:59:13
【问题描述】:

我不经常使用 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
);

上面那条标记线是什么?似乎外键 col 而不是指定 int/int8 它正在指定自定义名称 t2_id?

而在上面引用的table2 pk 列中,类型为serial 并标记为t2_id_col

这是一些奇特的语法吗?还是与 pgAdmin 相关的东西?

【问题讨论】:

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

标签: postgresql types foreign-keys pgadmin


【解决方案1】:

为了确定,运行:

SELECT *
FROM   pg_type
WHERE  typname = 't2_id'

如果typtyped,则它是一个域,由CREATE DOMAIN 创建。
或者在 pgAdmin 中只需检查“对象浏览器”中的域列表。

是的,这有点与 pgAdmin 相关,因为它是出于礼貌地显示 serial 列。 serial 不是实际类型,底层类型是 integer。因此,您的域类型也必须基于 integer 以允许外键,这需要匹配基本类型。详情:
Safely and cleanly rename tables that use serial primary key columns in Postgres?

【讨论】:

    猜你喜欢
    • 2019-08-08
    • 1970-01-01
    • 2011-03-23
    • 2020-12-01
    • 2015-09-30
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多