前段时间,我询问将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
而不是忽略的类似查询。我了解replace
与insert
非常相似,只是如果它们具有相同的键,它就会替换旧值。我想不出更好的方法,所以我继续使用insert
,但是我应该以不同的方式实现它吗?
感谢所有人,伙计。
答案 0 :(得分:1)
IGNORE
表示不会插入表中已存在的行。刚刚创建了表,但还没有任何行。因此,在这种情况下,该选项无关紧要。
MySQL REPLACE
应该是
DELETE .. USING insert_list .. WHERE ...;
INSERT .. ;
在一次交易中。如果没有DELETE的INSERT成功,则结果有效。没有冲突的行,因此首先不需要DELETE。但是,如果任何现有行与INSERT冲突,则可能会回滚操作。除了序列中的间隙之外,这没有任何伤害,它们永远不会回滚。