首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >唯一列对为A,B或B,A

唯一列对为A,B或B,A
EN

Stack Overflow用户
提问于 2009-05-10 03:47:10
回答 4查看 1.5K关注 0票数 3

如果我有一个包含两个列( TeamA和TeamB )的联接表,那么如何确保每一对都是唯一的呢?

很明显,我可以在这些列上加一个唯一的综合索引,但这只会确保A,B的唯一性,而不是B,A,对吗?

代码语言:javascript
运行
复制
TeamA | TeamB
-------------
 red  | blue
 pink | blue
 blue | red

如您所见,“红色与蓝色”已经被指定为第一条记录,然后再次指定为“最后一条”。这应该是非法的,因为他们将已经面对对方。

编辑:也有办法处理SELECT案例吗?或者是最新消息?删除?等等。

同时,我们也提出了主场或客场的概念,这在这里可能很重要。这个最初的概念是在我思考如何在DB端构建一个括号系统的时候想到的。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-05-10 03:50:29

如果您的RDBMS (您没有指定)支持触发器,那么在该表上创建一个触发器来执行您的约束。

创建一个触发器,在INSERT上触发,检查一对是否已经存在,顺序是否颠倒。如果确实回滚,则允许插入。

票数 2
EN

Stack Overflow用户

发布于 2009-05-10 03:55:27

定义一个约束,例如,A列中的值必须小于B列中的值:因此允许插入{ blue,red},但不插入{ red,blue},因为蓝色小于红色。

票数 4
EN

Stack Overflow用户

发布于 2009-05-10 05:06:29

下面是一些用于Mitch描述的触发器方法的示例代码。

我还没有测试过这个代码,现在已经是深夜了:-)

代码语言:javascript
运行
复制
CREATE TRIGGER trig_addTeam
ON Teams
FOR INSERT, UPDATE
AS

DECLARE @TeamA VARCHAR(100) 
DECLARE @TeamB VARCHAR(100)
DECLARE @Count INT

SELECT @TeamA = (SELECT TeamA FROM Inserted)
SELECT @TeamB = (SELECT TeamB FROM Inserted)

SELECT @Count = (SELECT COUNT(*) FROM TEAMS WHERE (TeamA = @TeamA AND TeamB = @TeamB)
                 OR (TeamA = @TeamB AND TeamB = @TeamA))

IF @Count > 0 THEN

BEGIN
    ROLLBACK TRANSACTION
END 

这样做的目的是查看当前表中是否存在A、x、B或B++的序列。如果是,则返回的计数大于零,事务将回滚,而不提交给数据库。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/844646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档