запрос postgresql к mysql

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.

  • 1
    попробуйте описать структуру таблицы и то, что вы действительно хотите сделать с помощью этой функции. Кроме того, вы можете проверить phpmyadmin и MySQL Workbench, где вы можете выполнять операции SQL графически.
  • 0
    Это похоже на (ошибочную и ненадежную) попытку реализовать ограничение исключения ( postgresql.org/docs/current/static/… ). Ваша реализация крайне маловероятна, чтобы фактически работать перед любым параллелизмом; он должен быть срочно заменен ограничением исключения PostgreSQL 9.1+.
Показать ещё 3 комментария
Теги:
plpgsql

2 ответа

3

Запрос можно упростить, чтобы:

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

который, вероятно, может использовать составной индекс на {a, b}

  • 0
    Это не обеспечит ограничения, хотя. Для этого им понадобится триггер, чтобы проверить, что из (значительно улучшенного) запроса возвращается только одна строка.
  • 0
    Встраивание его в функцию триггера оставлено читателю в качестве упражнения. Кроме того: вопрос помечен как mysql, так и postgres, и синтаксис триггера может отличаться. В postgres все это может быть реализовано с помощью ограничения внешнего ключа + уникальное {a, b} + CHECK (a <b) и / или правила перезаписи, если a оказывается> b.
Показать ещё 1 комментарий
1

Кажется, вы пытаетесь реализовать ограничение ASSERTION, CHECK уровне таблицы или ограничение исключения, хотя показанная реализация не будет работать надежно.

MySQL не поддерживает CREATE ASSERTION; насколько я знаю, ни одна другая текущая СУБД. Также поддержка подзапросов в CHECK для утверждений на уровне таблицы обычно поддерживается.

Возможно, вам нужно будет эмулировать поведение, которое вы хотите, с помощью триггера. Видеть:

@a_horse_with_no_name указывает на комментарии, которые вы можете достичь с помощью составного уникального индекса выражения. MySQL не поддерживает индексы выражений, поэтому, как отмечено в комментарии, он не будет работать в MySQL. Следите за этой ошибкой.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню