我不确定我是否正确地将此MySQL查询转换为Postgresql

时间:2011-10-17 20:29:12

标签: mysql postgresql

前段时间,我询问将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));

我的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而不是忽略的类似查询。我了解replaceinsert非常相似,只是如果它们具有相同的键,它就会替换旧值。我想不出更好的方法,所以我继续使用insert,但是我应该以不同的方式实现它吗?

感谢所有人,伙计。

1 个答案:

答案 0 :(得分:1)

  • IGNORE表示不会插入表中已存在的行。刚刚创建了表,但还没有任何行。因此,在这种情况下,该选项无关紧要。

  • MySQL REPLACE应该是

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

在一次交易中。如果没有DELETE的INSERT成功,则结果有效。没有冲突的行,因此首先不需要DELETE。但是,如果任何现有行与INSERT冲突,则可能会回滚操作。除了序列中的间隙之外,这没有任何伤害,它们永远不会回滚。