0

我想在 MySQL 中创建类似于以下 PostgreSQL 的查询:

CREATE FUNCTION check_unique_pair(IN id1 INTEGER, IN id2 INTEGER) RETURNS INTEGER AS   $body$
DECLARE retval INTEGER DEFAULT 0;
BEGIN 
 SELECT COUNT(*) INTO retval FROM (
  SELECT * FROM edges WHERE a = id1 AND b = id2
  UNION ALL
  SELECT * FROM edges WHERE a = id2 AND b = id1
)  AS pairs;
RETURN retval;
END
$body$
LANGUAGE 'plpgsql';

ALTER TABLE edges ADD CONSTRAINT unique_pair CHECK (check_unique_pair(a, b) < 1);

我是 MySQL 新手。

4

2 回答 2

3

查询可以简化为:

SELECT COUNT(*)
FROM edges
WHERE a IN (id1, id2)
AND b in (id1, id2)
AND a <> b
   ;

,它可能在 {a,b} 上使用复合索引

于 2012-11-06T12:07:28.087 回答
1

您似乎正在尝试实现ASSERTION表级CHECK约束或排除约束,尽管显示的实现不会可靠地工作。

MySQL 不支持CREATE ASSERTION;据我所知,任何其他当前的 RDBMS 也没有。通常也不支持CHECK对表级断言的子查询支持。

您可能需要使用触发器来模拟您想要的行为。看:

@a_horse_with_no_name 在评论中指出,您可以使用复合唯一表达式索引来实现这一点。MySQL不支持表达式索引,因此如评论中所述,它在 MySQL 中不起作用。密切注意那个错误。

于 2012-11-06T09:49:22.353 回答