Запрос PostgresSQL pgadmin 4

#postgresql #ddl

Вопрос:

 if
Select EXISTS (
  select FROM information_schema.tables 
   WHERE  table_schema = 'public'
   AND    table_name   = 'Backups'
   );
Then
INSERT INTO Backups
SELECT * FROM dd;

Else 
CREATE TABLE Backups (LIKE dd INCLUDING ALL);
INSERT INTO Backups
SELECT * FROM dd;

end if;
 

В этом коде сначала я проверяю, существует ли таблица с именем «Резервная копия» или нет, если она существует, скопируйте данные из таблицы » dd «в резервную копию, а если нет, создайте таблицу с именем «Резервная копия», например «dd», и вставьте данные из » dd » в «Резервную копию». но он показывает ошибку рядом с «если», может ли кто-нибудь сказать, почему это происходит

Ответ №1:

IF может использоваться только внутри процедурного кода (PL/pgSQL), и это может использоваться только в сохраненных функциях, процедурах или анонимном блоке PL/pgSQL DO .

Но для этого вам не нужен IF или даже PL/pgSQL.

 CREATE TABLE if not exists Backups (LIKE dd INCLUDING ALL);

INSERT INTO Backups
SELECT * FROM dd;
 

Если вы хотите убедиться, что таблица резервных копий пуста, просто добавьте

 truncate table backups; 
 

сразу после CREATE TABLE заявления.

Комментарии:

1. но у меня есть еще один запрос , который, на самом деле, я пытаюсь создать триггер, который запускается, когда мы выполняем вставку или обновление любой таблицы, из которой создается резервная копия этой таблицы…но как мы можем записать имя таблицы, в которой мы выполняем вставку или обновление, в запросе, из которого нам не нужно жестко кодировать имя этой таблицы, как мы делаем выше «dd».

2. например, здесь: СОЗДАЙТЕ ТАБЛИЦУ, если не существует резервных копий (НАПРИМЕР, dd, ВКЛЮЧАЯ ВСЕ); ВСТАВЬТЕ В резервные копии ВЫБЕРИТЕ * ИЗ dd; ———>здесь вместо » dd » я должен записать имя таблицы, в которую я выполняю вставку или обновление во время выполнения

Ответ №2:

Это не инструкция SQL, а код PL/pgSQL.

Есть также ошибка: она должна быть

 IF EXISTS (SELECT ...)
 

вместо

 IF SELECT EXISTS (SELECT ...)
 

Вы можете запустить этот код в DO виде инструкции SQL:

 DO
'BEGIN
   /* your code goes here */
END;';