Я хочу создать запрос в 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.
Запрос можно упростить, чтобы:
SELECT COUNT(*)
FROM edges
WHERE a IN (id1, id2)
AND b in (id1, id2)
AND a <> b
;
который, вероятно, может использовать составной индекс на {a, b}
Кажется, вы пытаетесь реализовать ограничение ASSERTION
, CHECK
уровне таблицы или ограничение исключения, хотя показанная реализация не будет работать надежно.
MySQL не поддерживает CREATE ASSERTION
; насколько я знаю, ни одна другая текущая СУБД. Также поддержка подзапросов в CHECK
для утверждений на уровне таблицы обычно поддерживается.
Возможно, вам нужно будет эмулировать поведение, которое вы хотите, с помощью триггера. Видеть:
@a_horse_with_no_name указывает на комментарии, которые вы можете достичь с помощью составного уникального индекса выражения. MySQL не поддерживает индексы выражений, поэтому, как отмечено в комментарии, он не будет работать в MySQL. Следите за этой ошибкой.