Postgres的特定算法是什么用来截断外键的标识符?



i使用/有助于Haskell库(持久)生成Postgres的迁移。图书馆通过读取Haskell数据类型来工作,然后生成与这些类型相匹配的适当表。

它通过查看基于Haskell类型的数据库架构的预期(即,名为Settings的HASKELL记录都意味着应该创建一个表名为settings),然后将其与Postgres中的内容进行比较(如果没有名称settings,它将执行迁移以创建该表)。

不幸的是,当Postgres截断标识符的标识符以63个字符为单位时,这并不能很好地工作。给定一些SQL喜欢:

CREATE TABLE an_extremely_fantastically_super_long_name_child(an_extremely_fantastically_super_long_name_parent_id INTEGER NOT NULL REFERENCES an_extremely_fantastically_super_long_name_parent);
CREATE TABLE my_massively_huge_biggest_child_table (biggest_ever_column_name_that_will_reference_a_parent INTEGER NOT NULL REFERENCES an_extremely_fantastically_super_long_name_parent);

它将产生一个名为my_massively_huge_biggest_chi_biggest_ever_column_name_tha_fkey的外键约束(删除表名的一部分和列名称的一部分并添加_fkey)。

我可以使Haskell库截断它想要创建的所有标识符,以解决63个字符,这将解决问题。但是,我想与Postgres使用REFERENCES语法时生成的内容保持兼容性。为此,我需要复制Postgres中使用的算法。这是什么算法?我试图在Postgres源代码中搜索它,但是由于Postgres是一个非常庞大的项目,因此很难找到。

我认为,如果我给出了足够的示例数据,我可以算出确切的公式,但是也只能查看源代码。

~postgresql/src/backend/commands/indexcmds.c

行#2000之后:ChooseIndexName()和朋友。

[这是针对索引,但是该方法对于其他生成的名称相似]

最新更新