Синтаксическая ошибка PhpPgAdmin при создании представления

Я пытаюсь создать представление в PhpPgAdmin (PostGreSQL db), которое имеет следующий оператор SQL:

DELETE FROM myTable WHERE myTable.error IS NULL;

PhpPgAdmin выдает следующую ошибку:

ОШИБКА: синтаксическая ошибка в символе 59 «УДАЛИТЬ» или рядом с ним. В операторе: СОЗДАТЬ ИЛИ ЗАМЕНИТЬ ВИД «Схема 1». «Удалить пустые ошибки» КАК УДАЛИТЬ ИЗ myTable, ГДЕ myTable.error IS NULL;

Насколько я могу судить, этот оператор SQL действителен, и у меня есть права на удаление таблицы. Оператор DELETE не разрешен в представлениях? Любые идеи, что я делаю неправильно?


person Ted N    schedule 30.06.2010    source источник


Ответы (1)


Представления используются для отображения данных только из операторов SELECT (обычно, когда SELECT сложный). Представления не могут содержать УДАЛЕНИЯ, ОБНОВЛЕНИЯ или ВСТАВКИ.

Возможно, вам нужна функция?

РЕДАКТИРОВАТЬ: Как указывает OMG Ponies, у вас могут быть обновляемые представления, но именно здесь вы должны выполнить DELETE для существующего представления, а затем использовать RULE, чтобы переписать запрос как DELETE.

И, пожалуйста, не оборачивайте вызов функции для выполнения DELETE в качестве побочного эффекта в представлении. Это неожиданно, и каждый раз, когда это происходит, Иисус стреляет в щенка.

person rfusca    schedule 30.06.2010
comment
Postgres поддерживает обновляемые представления с помощью правил: postgresql.org/docs/8.2/ статический/sql-createview.html - person OMG Ponies; 30.06.2010
comment
А вызов функции можно обернуть внутри представления. - person Frank Heikens; 30.06.2010
comment
Хорошо, у вас могут быть обновляемые представления с помощью правил, и вы можете обернуть вызов функции внутри представления, но я никогда не видел простого DELETE внутри представления. - person pcent; 30.06.2010
comment
Хотя да, у вас могут быть обновляемые представления, на самом деле это не то, что требуется. Он не пытался УДАЛИТЬ из представления, он пытался создать представление, которое является удалением.... которое отличается. - person rfusca; 30.06.2010
comment
На самом деле вы правы, мне нужно использовать функцию. Я просто пытаюсь выполнить однократную задачу по очистке большого набора данных. Поэтому я последовал вашему совету и создал функцию, но, похоже, нет способа выполнить эту функцию из PhpPgAdmin. Что рекомендуется для такого рода вещей? - person Ted N; 01.07.2010
comment
выберите call_your_function_here(); - person rfusca; 01.07.2010