0

以下のPostgreSQLと同様のMySQLでクエリを作成したい:

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 に答える