【问题标题】:Why do my POSTGRES composite key can't accept this input?为什么我的 POSTGRES 复合键不能接受这个输入?
【发布时间】:2021-11-02 14:53:08
【问题描述】:

我正在 Postgres (Supabase) 服务器中创建一个包含内容的表。此表应仅包含内容 ID。

在另一个表中,我存储了此内容的翻译(即内容 ID、翻译的语言和国家/地区代码以及翻译文本)。

类似这样的: 内容表 语言代码表 国家代码表 内容翻译

在目录表中,我尝试使用 3 个外键的组合作为主键,它们是语言代码、国家代码和内容 ID。

我正在创建这样的表:

CREATE TABLE public.contents_localization_test (
  content_id uuid REFERENCES public.contents (content_id),
  lang_code text REFERENCES public.lang_codes (lang_code),
  country_code text REFERENCES public.lang_country_codes (country_code),
  content_name text,
  CONSTRAINT unique_entry PRIMARY KEY (content_id, lang_code, country_code)
);

我期望被接受的条目:

( “我的 ID-1”, "恩", “我们”, “英文文本” )

( “我的 ID-1”, "pt", "BR", "Texto em Português" )

由于 id 重复,它们未被明确接受。我做错了什么?


编辑 被接受的数据样本(它是第一个):

content_id : 68f8ebc2-ac50-44d0-a626-4babd343d2f9
lang_code: pt
country_code: BR
content_name: Tabela Periódica

不被接受的数据示例:

content_id : 68f8ebc2-ac50-44d0-a626-4babd343d2f9
lang_code: en
country_code: US
content_name: Periodic Table

这是错误: 错误:错误:在表“contents_localization_test”上插入或更新违反了外键约束“contents_localization_test_country_code_fkey”


编辑 2

删除国家表的引用后,问题就消失了。


编辑 3 我发现了问题。谢谢大家的帮助。

【问题讨论】:

  • 为什么会触发重复?对不起,我是 Postgres 的新手。由于它是一个复合键,它不应该作为一个整体来“评估”,而是作为每个“块”键?
  • 这是错误:错误:错误:在表“contents_localization”上插入或更新违反外键约束
  • 是的,如果你有重复的例子,比如("my-id-1", "en", "US"),那么你会得到一个重复的错误。虽然我不确定如果content_id 真的是uuid,那会发生什么?
  • 是的,这只是一个示例,抱歉,我认为最好简化:P。原始 id 是 68f8ebc2-ac50-44d0-a626-4babd343d2f9 不幸的是,我没有重复相同 id 和语言代码的实例。我不知道这是否是一个错误,或者我做错了什么,或者即使是专门来自 Supabase 的东西(我怀疑这是因为我使用纯 sql 创建表)
  • @AdrianKlaver 我打算仅在为一种语言和 id 重复输入时抛出这些重复错误,因此它不允许为同一种语言对同一种语言进行多次翻译文本。但由于我使用两种不同的语言代码,我无法发现问题

标签: sql postgresql supabase


【解决方案1】:

所以我就是这样解决的:


编辑

谢谢阿德里安!

我决定停用/激活主键 外键中的每一个(即从主键中删除它们 它们的参考作为外键),看看会发生什么。我从 country_code 表开始。我停用了它,尝试使用不同的语言代码添加重复的国家(好的!它通过了!)。然后我尝试添加一个具有相同国家代码、相同语言代码和相同 content_id 的新条目。该错误清楚地表明这个新插入是不可能的,因为 id 是重复的(现在是!)。 所以我想我的 contry_codes 表以某种方式损坏了(我无法猜测这是何时或如何发生的)。

我的国家/地区表被破坏了(我不知道为什么!)并且破坏了其他所有内容。表本身很好,但看起来它有一个循环引用(我不知道如何命名),这使得国家代码本身算作两次(我在这里猜测......)。简而言之:我需要使用第一个的每个代码创建一个新的 country_codes 表,并更改第二个的引用。现在一切正常。

我正在使用他们的 UI 创建此表,因此在执行此操作或刷新浏览器时可能出现错误。

要明确一点:表的第二个版本与第一个版本具有相同的属性、相同的外键和相同的列名称。所以我想当我创建第一个表时发生了一种我无法理解的错误或疯狂的事情。

因此,如果您从未来看到这种情况:请停用并激活每个复合键,然后尝试添加应允许且不应比较的内容。这样您就可以找到有问题的表。我希望这只是一个大声笑。

感谢大家的帮助和理解我糟糕的英语:D!

【讨论】:

  • 您没有停用主键,而是停用了外键引用。在这里重复 PK 没有错,这是 FK 参考。 PK 是不是就包含了所有的 FK 引用。如果 country_code 不是 PK 的一部分,您也会遇到同样的错误。
  • 是的!我将编辑我自己的答案:o 非常感谢阿德里安!你是绝对正确的。我打错了,但意思是一样的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 2011-04-23
  • 2022-10-23
  • 2013-08-31
  • 2021-11-14
相关资源
最近更新 更多