Кратка версия: Коя psql команда трябва да използвам, за да създам временна таблица, която е клонинг на дадена таблица, с изключение на дадена колона?
create temp table bar_temp as <columns from foo.bar excluding 'insert_date'>
Обосновка: Имам някои много големи CSV файлове, които искам да кача групово в Postges DB (понастоящем 8.4 - мигрирам към 9.x).
Когато качвам тези CSV файлове, искам да добавя допълнително поле, например поле "дата".
Използване на тази публикация като вдъхновение: (Как да актуализирам избрани редове със стойности от CSV файл в Postgres?) Опитвам се да направя следното:
- Създайте временна таблица от схемата на целевата таблица, като изключите колоната "дата".
- Изпълнете командата '\COPY', за да качите във временната таблица.
- Актуализирайте записите в целевата таблица със записите във временната таблица + допълнителния запис в колоната за дата.
Всичко това е ясно, с изключение на стъпка 1. Ако имената на колоните са известни предварително, този ред може да бъде твърдо кодиран. В моя случай имам редица подобни входни файлове със съответните таблици и искам решението да бъде гъвкаво, за да се справи с промените в схемата.
Моето хакерско решение е да имам скрипт за предварителна обработка, който определя схемата на временната таблица, след което записва тази команда CREATE в SQL скрипта, преди да се изпълни, напр.
"SELECT 'SELECT ' || array_to_string(ARRAY(SELECT 'o' || '.' || c.column_name FROM information_schema.columns As c WHERE table_name = '$table' AND c.column_name NOT IN('dt')), ',') || ' FROM $schema.$table As o'"
което ми дава нещо подобно
SELECT o.name,o.address from foo.bar As o
който след това може да се използва в оператора create
create temp table temp_tbl as SELECT o.name,o.address from foo.bar As o
Мисля обаче, че трябва да се избягва извършването на тази стъпка за откриване на схема в самия PSQL скрипт. Разгледах използването на "EXEC", но доколкото както виждам, ще трябва да поставя това във функция, типът връщане на това трябва да изброява колоните на таблицата!
Някакви предположения?
EXECUTE
, обикновено сFORMAT
. Направете заявка къмinformation_schema
илиpg_catalog
изгледи, за да получите списъка с колони на таблицата. Ще оставя подробен пример на някой друг, но това трябва да ви насочи на правилния път. В SQL няма концепция за казване Всички колони освен тази. - person Craig Ringer   schedule 24.05.2013