Я не уверен, правильно ли я перевел этот запрос MySQL в Postgresql - PullRequest
0 голосов
/ 18 октября 2011

Некоторое время назад я спросил об изменении запроса MySQL на Postgresql .И, я думаю, я получил это, но теперь у меня есть другой запрос, который похож, поэтому я сделал то же самое, но я не уверен, работает ли он так, как задумано.Исходный запрос MySQL:

create temporary table IF NOT EXISTS temptable(id int(11) primary key, shared int(1) default 0) 
ignore (SELECT 6 as id) UNION (SELECT user2role.userid AS userid FROM user2role 
INNER JOIN users ON users.id=user2role.userid 
INNER JOIN role ON role.roleid=user2role.roleid 
WHERE role.parentrole like 'H1::H2::H3::H4::H5::%') 
UNION (SELECT groupid FROM groups where groupid in (3,4,2));

My Postgresql (9.1) версия:

Create TEMP TABLE IF NOT EXISTS temptable(id int primary key, shared int default 0);
Insert into temptable SELECT x.id FROM ( SELECT user2role.userid AS id FROM user2role 
INNER JOIN users ON users.id=user2role.userid 
INNER JOIN role ON role.roleid=user2role.roleid WHERE role.parentrole like 'H1::H2::H3::H4::%' 
UNION (SELECT groupid FROM groups where groupid in (2,3,4))) x 
LEFT JOIN temptable t USING (id) WHERE t.id IS NULL

Теперь меня больше всего беспокоит бит ignore (SELECT 6 as id) UNION.Я не совсем понимаю смысл SELECT 6 как id.

Кроме того, это не имеет отношения к этому запросу, но у меня есть другой аналогичный запрос, который использует replace вместо игнорирования.Я понимаю, что replace очень похож на insert, просто он заменяет старые значения, если они имеют одинаковый ключ.Я не мог придумать лучшего пути, поэтому я просто пошел дальше и использовал insert, но стоит ли мне вместо этого реализовать его по-другому?

Спасибо за все, ребята.

1 Ответ

1 голос
/ 18 октября 2011
  • IGNORE означает, что строки, уже присутствующие в таблице, не будут вставлены.Поскольку вы только что создали таблицу, еще не может быть строк.Следовательно, в этом случае опция не имеет значения.

  • MySQL REPLACE должно быть

    DELETE .. USING insert_list .. WHERE ...;
    INSERT .. ;
    

в одной транзакции.Если INSERT без DELETE успешен, то результат действителен.Строк с конфликтами не было, поэтому УДАЛЕНИЕ не было необходимости.Однако вы рискуете откатить операцию, если какая-либо из существующих строк конфликтует с INSERT.Это не вредит, кроме пробелов в последовательностях, которые никогда не откатываются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...