SQL唯一组合的两个列和反过来

26 浏览
0 Comments

SQL唯一组合的两个列和反过来

我有以下表格:

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;

谢谢。

0
0 Comments

问题的出现原因是需要在数据库中创建一个唯一的组合,这个组合由两列的值组成。解决方法是添加两个列key_minkey_max到表中,使用触发器计算key_minkey_1key_2之间的最小值,key_maxkey_1key_2之间的最大值,并创建唯一约束UNIQUE(key_min,key_max)。可以在MariaDB中使用虚拟列实现类似的解决方案,参考链接:here

0
0 Comments

问题的原因是希望在SQL中实现两列的唯一组合,即确保两列的值的组合在整个表中是唯一的。然而,仅使用唯一约束是无法实现此目标的。

解决方法是使用唯一函数索引来替代唯一约束。可以使用以下SQL语句创建一个唯一函数索引:

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

上述代码中,`table_name_uix`是唯一函数索引的名称,`table_name`是要创建索引的表名,`key_1`和`key_2`是要组合的两列。

此方法的详细信息可以在这里找到关于Postgres唯一约束与唯一索引的区别的讨论。

使用上述方法,我们可以确保在表中的任何时候,两列的组合值都是唯一的。这对于需要确保数据完整性和避免重复数据的应用程序非常有用。

0
0 Comments

在SQL中,要实现两列的唯一组合并不是一件简单的事情。因为UNIQUE只接受属性名,无法直接将两列作为唯一约束。但是我们可以通过创建两个新属性minatt和maxatt(保证它们有序),然后将这两个属性作为一个单一的UNIQUE约束来解决这个问题。同时,我们还可以创建一个触发器,在插入或更新数据时自动更新这两个属性,这样可以避免一致性问题的产生。

另一种解决方法是创建一个触发器来检查约束条件,类似于手动检查这些拼接组合的唯一性(这种方法可能比使用UNIQUE更复杂且容易出错)。

总结起来,解决这个问题的方法有两种:

1. 创建两个新属性minatt和maxatt,并将它们作为一个单一的UNIQUE约束。

2. 创建一个触发器来检查这两列的组合是否唯一。

具体的代码实现如下所示(以MySQL为例):

-- 创建表
CREATE TABLE my_table (
  column1 INT,
  column2 INT,
  minatt INT,
  maxatt INT
);
-- 添加唯一约束
ALTER TABLE my_table
ADD CONSTRAINT unique_combination UNIQUE (minatt, maxatt);
-- 创建触发器
DELIMITER //
CREATE TRIGGER update_attributes
BEFORE INSERT ON my_table
FOR EACH ROW
BEGIN
  SET NEW.minatt = LEAST(NEW.column1, NEW.column2);
  SET NEW.maxatt = GREATEST(NEW.column1, NEW.column2);
END//
DELIMITER ;

通过以上方法,我们可以实现两列的唯一组合,并且在插入或更新数据时自动更新minatt和maxatt属性,从而避免了数据一致性问题的产生。

0