1

我有下表

CREATE  TABLE IF NOT EXISTS `friends` (
  `userid` INT NOT NULL ,
  `friend` INT NOT NULL ,
  `status` INT(1) NOT NULL ,
  INDEX `user_id_fk_idx` (`userid` ASC) ,
  INDEX `friend_id_fk_idx` (`friend` ASC) ,
  PRIMARY KEY (`userid`, `friend`) ,
  CONSTRAINT `user_id_fk`
    FOREIGN KEY (`userid` )
    REFERENCES `network`.`users` (`userid` )
    ON DELETE CASCADE
    ON UPDATE CASCADE,
  CONSTRAINT `friend_id_fk`
    FOREIGN KEY (`friend` )
    REFERENCES `network`.`users` (`userid` )
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB;

当我想在这个表中插入一个新的元组时,我想检查那个元组是否已经存在。

示例:当我在表中插入 (1,2,0) 时,当且仅当 (1,2, ) 或 (2,1, ) 不存在于表中时,它必须运行。或者,如果我在表中搜索元组 (1,2, ),它必须搜索 (1,2, ) 和 (2,1,*) 并返回结果。

目前我正在为此运行两个查询,可以将其组合在一个查询中吗?

4

2 回答 2

1

一种方法是遵循此处的“双向”示例(非常好)

如何跨多列实现双向唯一索引

一旦你有了这个,你可以

  1. 选择,如果没有,请插入您的新数据。

或者

  1. 如果由于数据已经存在而引发错误,则插入并捕获错误。
于 2013-04-29T01:05:57.063 回答
0

aandb是你的用户 ID,TRUE如果有任何一个元组存在,那么这将给出,FALSE如果不存在

SELECT COUNT(*) > 0
FROM friends
WHERE
    (friends.userid = a AND friends.friend = b)
OR  (friends.userid = b AND friends.friend = a)

您还可以从表中构建双向关系

SELECT friends.userid AS userid, friends.friend AS friend FROM friends
UNION ALL
SELECT friends.friend AS userid, friends.userid AS friend FROM friends

如果您想在一个INSERT查询中完成所有操作,则INSERT ... SELECT需要WHERE NOT EXISTSSELECT part. 工作示例

INSERT INTO friends (userid, friend)
SELECT a,b FROM dual
WHERE NOT EXISTS (
    SELECT friends.userid
    FROM friends
    WHERE
        (friends.userid = a AND friends.friend = b)
    OR  (friends.userid = b AND friends.friend = a)
)
于 2013-04-29T00:56:38.220 回答