【问题标题】:Unique constraint on two columns for any combination in SQL Server?SQL Server中任何组合的两列的唯一约束?
【发布时间】:2020-09-24 13:21:04
【问题描述】:

我在数据库中有两列“Col_1”和“Col_2”。我想应用一个唯一约束,以便可以阻止 Col_1-Col_2 和 Col_2-Col_1 这两种组合。

可以说,现有的数据组合是:

Col_1    Col_2 
 ABC      DEF
 QWE      ZXC
 ASD      VBN

现在不应允许以下数据插入组合:

Col_1    Col_2 
 ABC      DEF
 DEF      ABC
 ZXC      QWE

【问题讨论】:

  • 所以在表上添加一个唯一的复合约束。我不清楚困难是什么,请您详细说明一下吗?
  • 两列的唯一约束按两列的顺序检查重复项。我也想阻止列的反向顺序的重复。假设一行在 Col_1 和 Col_2 中包含 'ABC' 和 'DEF',那么 ('ABC', 'DEF') 和 ('DEF', 'ABC') 的插入都需要被阻止。

标签: sql-server


【解决方案1】:

可以在创建表时创建约束,也可以通过更改现有表来创建约束。

创建一个新表

create table SomeTable(
  Col_1     varchar(20),
  Col_2     varchar(20),
  constraint unq_SomeTable_c1_c2 unique(Col_1, Col_2));
go

更改现有表

alter table SomeTable
add
  constraint unq_SomeTable_c1_c2 unique(Col_1, Col_2);

如果尝试重复插入,错误消息将如下所示

Msg 2627, Level 14, State 1, Line 7502
Violation of UNIQUE KEY constraint 'unq_SomeTable_c1_c2'. Cannot insert duplicate key in object 'dbo.SomeTable'. The duplicate key value is (ABC, DEF).
The statement has been terminated.

[编辑] 为了确保列的顺序无关紧要,我创建了一个 TRIGGER,它在 INSERTUPDATE 之后运行。错误信息可以随意更改。

create trigger trg_SomeTable_unq_c2c1_ins_upd on SomeTable
after insert, update
as
if exists(select 1 
            from SomeTable st join inserted i on st.Col_2=i.Col_1
                                            and st.Col_1=i.Col_2)
    rollback transaction;
go

测试用例

insert SomeTable(Col_1, Col_2) values
('ABC', 'DEF'),
('QER', 'ZXC'),
('ASD', 'VBN');

insert SomeTable(Col_1, Col_2) values
('DEF', 'ABC');

输出

    (3 row(s) affected)
    
Msg 3609, Level 16, State 1, Line 7514
The transaction ended in the trigger. The batch has been aborted.

【讨论】:

  • 这将阻止 Col1-Col2 的组合,但不会阻止 Col2-Col1 的组合。
  • 在查看了完成任务的各种方法之后,似乎触发器最有效
  • 谢谢@SteveC。这就是我要找的。​​span>
  • 发出回滚而不抛出错误不是错误处理或触发编码的好例子。到底有什么代码或人应该知道发生了错误以及错误是什么?
  • @SMor 问题似乎集中在约束上。 OP 本可以(仍然可以)跟进错误处理。
猜你喜欢
  • 1970-01-01
  • 2012-05-17
  • 2011-01-11
  • 1970-01-01
  • 2012-04-26
  • 1970-01-01
  • 1970-01-01
  • 2013-03-25
相关资源
最近更新 更多