当前位置: 首页 > 知识库问答 >
问题:

PostgreSQL中使用引用时可以省略外键吗?

居星阑
2023-03-14

我想知道这两个SQL陈述之间是否有任何(可能是微妙的)区别:

CREATE TABLE profiles (
    profile_id SERIAL PRIMARY KEY NOT NULL,
    bio TEXT,
    user_id INTEGER NOT NULL,
    FOREIGN KEY (user_id) REFERENCES users(user_id)
);

CREATE TABLE profiles (
    profile_id SERIAL PRIMARY KEY NOT NULL,
    bio TEXT,
    user_id INTEGER NOT NULL REFERENCES users(user_id) 
);

我注意到,当我在Postico中使用第一个符号创建表时,但稍后查看创建的profile表的DDL,FOREIGN KEY被删除,最终使用较短的第二个符号。

使用<code>FOREIGN KEY</code>创建表:

DDL视图不显示< code >外键:

因此,我想知道(并寻求确认)这两个语句实际上是100%等价的,或者它们对DB的作用是否有细微的差异。

任何指向官方资源的指针(也许还有它与MySQL的不同之处)都将不胜感激。

共有3个答案

何华灿
2023-03-14

在PostgreSQL中,通过外键约束定义外键。外键约束表示子表中一列或一组列中的值与父表的一列或列组中的值匹配。我们说外键约束维护子表和父表之间的引用完整性。

这可能会更好地向您解释,或者您可以阅读有关外键留档的信息。

孔寒
2023-03-14

DDL 视图不显示外键

由未知第三方工具在非参数中创建的DDL视图。

参见小提琴。在这两种情况下都存在外键。此外,我没有看到两个DDL查询的结果差异。

PS.作为建议 - 始终显式指定约束名称。如果您需要删除它,该怎么办?没有约束名称是有问题的...

笪建章
2023-03-14

您显示的两个示例做了相同的事情,只是使用了不同的语法。

第一种方法称为表约束,第二种列约束,但后一种名称有点误导,因为约束也在表上。

主要区别在于列约束语法更短,但不能用于所有约束:例如,如果您有一个包含两列的主键,则必须将其写入表约束语法。

 类似资料:
  • 问题内容: 在PostgreSQL中,我有一个数据库,我打算进行以下表声明: 一切正常,除了在创建最后一个表(更正)时出现以下错误: 错误:没有唯一的约束匹配给定键的引用表“提交” 我对更正表的打算是对每个提交都有唯一的更正,但是一个提交可以(也可以不)具有更正。 我该如何解决这个错误?是设计问题还是表声明错误? 问题答案: 外键约束不关心所引用的列是否在引用另一列本身。但是引用的列 必须 是唯一

  • 问题内容: 我认为外键意味着单行必须引用单行,但是我正在查看某些表,但事实并非如此。表1在表2的列2上有一个具有外键约束的列1,但是在表2中有很多记录在列2中具有相同的值。在column2上也有非唯一索引。这是什么意思?外键约束是否仅表示至少一条记录必须存在,且在正确的列中具有正确的值?我认为这意味着必须有一个这样的记录(不确定空值是否适合图片,但目前我对此不太担心)。 更新:显然,此行为特定于M

  • 我需要在应用程序中使用多个时区。 基本上,我的系统生成数据,来自地球上任何地方的客户都可以访问它。 由于我的数据有一个关联的时间戳,我考虑了以下策略来处理时区。 在邮件中: > 使用类型为我的时间戳创建我的表。不允许使用不带时区的时间戳,因为在我的情况下,混合使用和就像是一个定时炸弹。 将我的PG服务器系统的时区设置为`UTC。 在中设置(如果系统的TZ是UTC,可能就不需要了,但我有点偏执,这没

  • 问题内容: 我正在查看一些代码,并看到了以下符号。我不确定这三个点的含义以及您所说的名称。 谢谢。 问题答案: 这意味着此方法可以接收多个Object作为参数。为了更好地低估,请从此处检查以下示例: 省略号(…)标识可变数量的参数,并在以下求和方法中进行了演示。 在JVM的限制内,使用所需的任意多个用逗号分隔的整数参数来调用sumsum方法。一些示例:sum(10,20)和sum(18,20,30

  • 问题内容: 我看到过这样创建的对象: 但是我认为创建对象时括号不是可选的: 创建对象的前一种方法在ECMAScript标准中是否有效并定义?前一种创建对象的方式与后一种创建方式之间有什么区别吗?是一个比另一个更好的选择吗? 问题答案: 引用David Flanagan 1: 作为一种特殊情况,仅对于运算符,JavaScript通过在函数调用中没有参数的情况下允许省略括号来简化语法。以下是使用运算符

  • 我知道我可以为单列和复合列创建索引。A我还可以对一些表达式建立索引: 在按某种条件搜索数据的表达式上创建索引,而首先我指定字段首先需要排序,然后按条件输出结果,并基于此表达式构建索引。 (就像使用Couchbase时的索引) 但是我找不到关于这个的信息: 如果创建记录,我是否需要在同一事务中再次调用以创建此数据的索引(索引如上所述) 我看不出把它分成几个问题有什么意义,事实上,这是一个关于使用Sp