所以我正在处理的代码有这个语句由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函数。 怎么样替换?
对不起,感谢您的时间,哦,如果你们不忙或什么,你也可以告诉我如何模仿“忽略”,我目前的解决方案涉及任意删除它。
答案 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