在此 SO 回答中: PostgreSQL:默认约束名称
看起来我的外键(在创建表时未命名)应该默认为后缀_fkey
...但似乎却默认为后缀_foreign
。这是正常的吗?
我担心创建一个迁移,其中我假设约束名称并且它在我的环境中运行,然后在其他地方中断......
有什么办法可以确保我在任何环境下正确引用约束?
更新信息:
posgres 版本:16.4
创建密钥的客户端:knex
使用的完整 FK 命令:
table.foreign('userId').references('users.id')
带 \d 的 psql:
很抱歉,我不允许发布我们代码库中的代码,因此这里是经过删节的代码:
Indexes:
"***_pkey" PRIMARY KEY, btree (id)
"***" UNIQUE CONSTRAINT, btree ("***Id", "***Id")
Foreign-key constraints:
"***_***id_foreign" FOREIGN KEY ("***Id") REFERENCES ***(id)
"***_userid_foreign" FOREIGN KEY ("userId") REFERENCES users(id) <=== the column of interest
https://knexjs.org/guide/schema-builder.html#foreign显示语法:
withKeyName()
这似乎显示了您可以用来指定约束名称的可选方法。我不是 knex 的用户,所以我不会测试这个。试试看吧!
编辑:如果您不指定约束名称,knex 会选择一个,并且它可能与 PostgreSQL 自己的默认值不同。也就是说,knex 框架确实指定了一个约束名称,无论它是否是您所指定的。
您注意到文档中这样写道: