Может ли кто-нибудь помочь мне понять и преобразовать это утверждение MySql в Postgresql? - PullRequest
1 голос
/ 01 сентября 2011

поэтому в коде, над которым я работаю, этот оператор выполняется 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, но что заменить здесь?Я знаю, что замена похожа на вставку, но она также заменяет вещи, но в этом случае для замены не указывается ничего, поэтому она просто заменяет что-то ничем, и почему Select 1, я знаю, в значительной степени просто говорит вам, еслив вашей таблице есть строки или что-то, но какой смысл использовать это здесь?

После некоторых исследований я обнаружил, что ЕСЛИ НЕ СУЩЕСТВУЕТ, а замены не существует в PostgreSQL.Большинство сетевых источников предлагают использовать функции SQL для их замены.

Должен ли я использовать функцию SQL для эмуляции IF NOT EXIST?Если так, что бы я написал (извините, я довольно новичок в SQL) или я должен просто использовать функцию PHP.Как насчет замены?

Извините за беспокойство, спасибо за ваше время, о, и если вы, ребята, не заняты или что-то еще, вы могли бы также рассказать мне о том, как эмулировать "игнорировать", мое текущее решение предполагает произвольное его удаление.

Ответы [ 2 ]

2 голосов
/ 02 сентября 2011

Многие применения в MySQL для временных таблиц могут быть заменены в PostgreSQL обычными табличными выражениями или обычными подвыборками.

WITH someCTE AS (
    SELECT 
     ...
) SELECT/UPDATE/DELETE ... WHERE sometable.column = someCTE.another_column;
1 голос
/ 02 сентября 2011

Просмотр CREATE TABLE документации .Временные таблицы, как следует из названия, не являются постоянными:

Если указано, таблица создается как временная таблица.Временные таблицы автоматически удаляются в конце сеанса или, возможно, в конце текущей транзакции (см. 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 EXISTS MySQL CREATE TABLE не имеет *1015*, поэтому вы не можете его использовать.Если вы хотите создать какую-то таблицу, вам сначала нужно удалить существующую (если она существует).К счастью, вы можете использовать команду 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...