如果我有一个包含两个列( TeamA和TeamB )的联接表,那么如何确保每一对都是唯一的呢?
很明显,我可以在这些列上加一个唯一的综合索引,但这只会确保A,B的唯一性,而不是B,A,对吗?
TeamA | TeamB
-------------
red | blue
pink | blue
blue | red如您所见,“红色与蓝色”已经被指定为第一条记录,然后再次指定为“最后一条”。这应该是非法的,因为他们将已经面对对方。
编辑:也有办法处理SELECT案例吗?或者是最新消息?删除?等等。
同时,我们也提出了主场或客场的概念,这在这里可能很重要。这个最初的概念是在我思考如何在DB端构建一个括号系统的时候想到的。
发布于 2009-05-10 03:50:29
如果您的RDBMS (您没有指定)支持触发器,那么在该表上创建一个触发器来执行您的约束。
创建一个触发器,在INSERT上触发,检查一对是否已经存在,顺序是否颠倒。如果确实回滚,则允许插入。
发布于 2009-05-10 03:55:27
定义一个约束,例如,A列中的值必须小于B列中的值:因此允许插入{ blue,red},但不插入{ red,blue},因为蓝色小于红色。
发布于 2009-05-10 05:06:29
下面是一些用于Mitch描述的触发器方法的示例代码。
我还没有测试过这个代码,现在已经是深夜了:-)
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++的序列。如果是,则返回的计数大于零,事务将回滚,而不提交给数据库。
https://stackoverflow.com/questions/844646
复制相似问题