Что делает выражение output_expression для "DELETE FROM table"?
Недавно я столкнулся с странностью. Допустим, что SQL:
DELETE FROM customer *;
Документация для PostgreSQL DELETE говорит, что звезда является возможным значением для output_expression
:
Выражение, которое должно быть вычислено и возвращено командой DELETE после каждая строка удаляется. Выражение может использовать любые имена столбцов таблицы или таблицы (ов), перечисленных в ИСПОЛЬЗОВАНИИ. Напишите *, чтобы вернуть все столбцы.
Я пробовал его с и без звезды и не вижу разницы. На самом деле, я могу поместить только что-нибудь одно слово после имени таблицы, и оно принято. Это даже не должно быть фактическое имя столбца. Ничего лишнего не возвращается.
db=> DELETE FROM customer wheeeeeee;
DELETE 19
Итак, что он делает и для чего я могу использовать его?
Вопрос также опубликован в списке рассылки PostgreSQL.
Ответы
Ответ 1
Звездочка не output_expression, для этого вам нужно будет использовать ключевое слово RETURNING
. Вместо этого это старый, устаревший синтаксис для включения дочерних таблиц в запросы. (Последняя версия, для которой она документирована, выглядит PostgreSQL 8.1. Поскольку синтаксис по-прежнему действителен, это ошибка документации, поскольку точки Тома Лейна в приведенной ниже ссылке.)
Так как PostgreSQL 7.1 это значение по умолчанию (если sql_inheritance не выключено), а ключевое слово ONLY
используется для противоположного, поэтому * не очень полезно.
См. этот пояснительный пост от Tom Lane в списке рассылки PostgreSQL.