簡體   English   中英

有人可以幫助我理解並將此MySql語句轉換為Postgresql嗎?

[英]Could someone help me understand and convert this MySql statement into Postgresql?

因此,我正在處理的代碼使該語句由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

我不太清楚這里到底發生了什么,我知道什么是臨時表,而且我可以很准確地估計出如果NOT EXIST會做什么,但是替換在這里做什么呢? 我知道replace就像insert一樣,但是它也可以替換東西,但是在這種情況下,沒有為它指定要替換的東西,所以它只是替換為空什么,為什么Select 1,我知道幾乎可以告訴您是否您的表有行或其他東西,但是在這里使用它有什么意義呢?

經過研究,我發現PostgreSQL中不存在IF NOT EXIST和replace。 大多數在線資源都建議使用SQL函數代替它們。

是否應該使用SQL函數來模擬IF NOT EXIST? 如果是這樣,我該寫些什么(對不起,我對SQL還很陌生)還是應該只使用PHP函數。 那替換呢?

很抱歉給您帶來麻煩,感謝您的時間,哦,如果你們不忙或沒事,您也可以告訴我如何模仿“忽略”,我目前的解決方案是任意刪除它。

在MySQL中,臨時表的許多用途都可以在PostgreSQL中用普通表表達式或普通子選擇替換。

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

查看CREATE TABLE文檔 臨時表正如名稱所暗示的那樣不是永久的:

如果指定,該表將創建為臨時表。 臨時表在會話結束時或在當前事務結束時自動刪除 (請參見下面的“提交時”)。 臨時表存在時,具有相同名稱的現有永久表在當前會話中不可見,除非使用架構限定名稱引用它們。 在臨時表上創建的所有索引也會自動成為臨時索引。

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

=> 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的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM