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

SQL两列的唯一组合,反之亦然

邵毅
2023-03-14

我有下表:

ID
KEY_1
KEY_2

我希望KEY_1和KEY_2的组合是唯一的,反之亦然。

ALTER TABLE dbo.table_name
  ADD CONSTRAINT uq_table_name UNIQUE(KEY_1, KEY_2);

这样,我可以使KEY_1和KEY_2之间的组合唯一,但我也希望相反。

示例:

KEY_1 = 111;
KEY_2 = 222;

我无法再次插入此值,反之亦然。

这应该是无效的(因为它是同一对密钥):

KEY_1 = 222;
KEY_2 = 111;

谢啦

共有3个答案

卢阳泽
2023-03-14

您可以向表中添加两列,key_minkey_max,使用触发器计算key_min=介于key_1键_2之间的最小值key_max=在<code>key_1之间的最大值,并创建唯一约束(key_min,key_max)。您可以在这里看到使用MariaDB和虚拟列的类似解决方案

丌官远
2023-03-14

没有简单的方法可以做到这一点。

    < li >唯一仅接受属性名

解决这个问题的一种方法是创建两个新属性:minatt、maxatt(因此它们是有序的),然后将这两个属性作为一个唯一约束添加。

您还可以使用触发器自动更新这些属性(在插入/更新期间)。这样可以避免一致性问题。

另一种方法是使用触发器来检查约束(有点像元组约束,您可以手动检查这些连接的唯一性(听起来比唯一解决方案更复杂,更容易出错)。

傅嘉悦
2023-03-14

您可以使用唯一的函数索引而不是唯一的约束来实现这一点。

create unique index table_name_uix 
  on table_name (greatest(key_1, key_2), least(key_1, key_2));

有关 Postgres 唯一约束与唯一索引的详细信息,请单击此处

 类似资料:
  • 问题内容: 我一直在尝试找出是否有可能对两列的组合具有唯一约束。 具体来说,我有两列A和B。 我有下面这样的行 然后我希望以下组合在插入时失败 我尝试添加一个简单的约束 但这让我在已经存在时插入。 这可能吗?还是在插入之前必须检查组合是否存在? 问题答案: 您可以使用表达式的索引来执行此操作: 我不认为约束允许表达式(并且现在没有方便的Postgres进行测试),但这本质上是同一回事。

  • 问题内容: 在Oracle上是否有一种简单的方法来查询n个字段的唯一组合。我有一个非常简单的两场解决方案: 查询唯一组合: 通过此查询,可以认为1,2和2,1相同。不幸的是,它不适用于三字段结构(例如,必须将1,2,3视为与3,1,2相同,因为值的顺序无关紧要)。Oracle分析功能是否为该问题提供适当的解决方案?您能建议一些特定的Oracle分析功能吗? 问题答案: 您对2列的查询可以这样重写:

  • 问题内容: 我不确定这是否可行,但我想计算表中唯一值的数量。我知道要计算我执行的唯一FolderID的数量: 但是我想对文件夹表中的文件夹标识和用户标识的唯一组合数进行计数。有没有办法做到这一点? 问题答案:

  • 问题内容: 我花了点时间弄清楚我需要的SQL查询。 我有一个项目,该项目具有用户的工作室级别的用户角色,并且每个项目都有覆盖/覆盖工作室级别的角色的项目级别的角色。所有角色都是在工作室级别定义的,但是只有一些角色是在项目级别定义的(主要是与相应的工作室级别角色具有不同值的角色) g_studio_UsersInRole g_project_UsersInRole 我需要一个查询,该查询将给定项目I

  • 我有一张桌子,不知怎的,同一个人进了我的桌子两次。现在,主键只是一个自动编号,但还有两个字段存在,我想强制它们是唯一的。 例如,这些字段是: 我只想要一张带有唯一PersonNumber和Active=1的唱片 (因此这两个字段的组合必须是唯一的) SQL server中现有表的最佳方式是什么?我可以这样做,如果其他任何人使用与现有值相同的值进行插入,则插入失败,因此我不必在应用程序代码中担心这一

  • 我想在PostgreSQL中设置一个表,这样两列在一起必须是唯一的。任何一个值都可以有多个值,只要没有两个值同时共享。 例如: 因此,和可以重复,但不能同时重复。因此,这是允许的(不包括id) 但不是这个: