有人可以帮助我理解并将此MySql语句转换为Postgresql吗?

时间:2011-09-01 19:41:55

标签: mysql postgresql replace

所以我正在处理的代码有这个语句由PHP执行(注意:这是从PostgreSQL日志文件中获取的,因此它不包含任何PHP内容):

CREATE temporary table IF NOT EXIST temp tablename(id int primary key,
shared int default 0) replace select 1, userid as id 
from tablefoo where sharedid = 1337

我不太明白这里到底发生了什么,我知道临时表是什么,我可以非常准确地猜测IF NOT EXIST的作用,但是在这里做什么更换呢?我知道替换就像插入但它也替换了东西,但在这种情况下,没有指定替换它,所以它只是替换没有什么和为什么选择1,我知道这几乎只是告诉你是否你的桌子有行或什么,但在这里使用它有什么意义?

经过一番研究,我发现PostgreSQL中不存在IF NOT EXIST和replace。大多数在线资源都建议使用SQL函数来替换它们。

我应该使用SQL函数来模拟IF NOT EXIST吗?如果是这样,我会写什么(对不起,我是SQL的新手)或者我应该只使用PHP函数。 怎么样替换?

对不起,感谢您的时间,哦,如果你们不忙或什么,你也可以告诉我如何模仿“忽略”,我目前的解决方案涉及任意删除它。

2 个答案:

答案 0 :(得分:2)

MySQL中用于临时表的许多用法可以在PostgreSQL中用公共表表达式或普通子选择替换。

WITH someCTE AS (
    SELECT 
     ...
) SELECT/UPDATE/DELETE ... WHERE sometable.column = someCTE.another_column;

答案 1 :(得分:1)

查看CREATE TABLE documentation。临时表就像名称所示不是永久性的:

  

如果指定,则将表创建为临时表。临时   表格在会话结束时自动删除,或   可选地在当前事务结束时(请参阅ON COMMIT   下面)。现有的具有相同名称的永久表不可见   临时表存在时的当前会话,除非它们   使用模式限定名称引用。在a上创建的任何索引   临时表也是自动临时的。

特别是临时表存储在不同(非公共)模式中,例如:

=> Create Temporary Table someTempTable (value integer);
CREATE TABLE
=> \dt someTempTable
              List of relations
  Schema   |     Name      | Type  |  Owner
-----------+---------------+-------+----------
 pg_temp_2 | sometemptable | table | postgres
(1 row)

PostgreSQL在MySQL's CREATE TABLE中没有IF NOT EXISTS,因此您无法使用它。如果要创建某个表,首先需要删除现有表(如果存在)。幸运的是,您可以使用SQL命令 DROP TABLE IF EXISTS 来处理此问题:

=> Drop Table If Exists someTempTable;
DROP TABLE
=> Drop Table If Exists someTempTable;
NOTICE:  table "sometemptable" does not exist, skipping
DROP TABLE