#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;';