2011-09-01 33 views
1

所以我工作的代碼有由PHP(注:這是從PostgreSQL的日誌文件,採取因此它不包含任何PHP的東西):執行該語句有人可以幫助我理解並將此MySql語句轉換爲Postgresql?

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,我知道,非常簡單,只是告訴你,如果你的表有行或其他東西,但是在這裏使用它的意義何在?

經過一番研究,我發現IF NOT EXIST和replace在PostgreSQL中不存在。大多數在線資源提示使用SQL函數來替換它們。

我應該使用SQL函數來模擬IF NOT EXIST嗎?如果是這樣,我會寫什麼(對不起,我對SQL很陌生)還是應該使用PHP函數。 取代什麼?

很抱歉的麻煩,感謝您的時間,哦,如果你們是不是很忙或什麼的,你也可以告訴我如何模擬「忽略」,我目前的解決方案包括任意刪除。

回答

1

調查CREATE TABLE documentation。臨時表正如顧名思義不是永久性的:

如果指定,則表被創建爲臨時表。臨時 表在會話結束時自動刪除或 (可選)在當前事務結束時(請參閱下面的ON COMMIT )。而臨時表存在,除非他們 是用模式修飾的名字引用具有相同名稱的現有永久表是不可見 當前會話。在 臨時表創建的索引都是自動臨時的爲好。

特別是臨時表存儲在不同勢(非公開)的模式,例如:

=> 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沒有IF NOT EXISTSMySQL's CREATE TABLE,所以你不能使用它。如果你想創建一些表,你需要先刪除已有的一個(如果存在的話)。幸運的是,你可以使用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 
2

在MySQL的許多用途的臨時表可以在PostgreSQL裏有公用表表達式或普通子查詢所取代。

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

請注意,使用CTE刪除或更新僅適用於即將推出的9.1版本(「可寫入CTE」) –

相關問題