Перенести данные из одной таблицы в другую

Здравствуйте! Скажите как сначала перенести данные из одной таблицы А, в таблицу B, которые находятся в одной базе (разные имена и количество столбцов в таблицах), это я так понимаю через Insert. А потом один раз (через время) нужно будет обновить данные в таблице A в двух столбцах, данными из таблицы B (при этом остальные данные не должны измениться). если можно небольшой пример. Заранее благодарен

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Читайте документацию,

Читайте документацию, разделы
http://postgresql.ru.net/manual/dml.html
http://postgresql.ru.net/manual/queries.html
пробуйте. Если что-то получаться не будет - постараемся помочь

INSERT INTO "tableA" (npr)

INSERT INTO "tableA" (npr) SELECT (kpr) FROM "tableB" все нормально
когда INSERT INTO "tableA" (npr, product) SELECT (kpr, form) FROM "tableB", получаю ошибку

ERROR:  INSERT has more target COLUMNS than expressions
СТРОКА 1: INSERT INTO "tableA" (npr, product) SELECT (kpr, form) FROM ...

Не подскажите в чем дело?

> ERROR: INSERT has more

> ERROR: INSERT has more target COLUMNS than expressions
ОШИБКА: INSERT содержит больше колонок, чем выражения
А если попробовать:

INSERT INTO "tableA" (npr, product) SELECT kpr, form FROM "tableB";

Спасибо сейчас буду

Спасибо сейчас буду разбираться с update

UPDATE "tableA" SET (product,

UPDATE "tableA" SET (product, owf) = (tableB.form, tableB.fio)
FROM "tableB" 
WHERE tableB.kpr = tableA.npr

Ошибка, что отсутствует пункт From для tableb
ERROR:  missing FROM-clause entry FOR TABLE "tableb"
LINE 1: UPDATE "tableA" SET (product, owf) = (tableB.form, tableB.fi...

Разумеется. А где вы в

Разумеется. А где вы в руководстве такой синтаксис нашли?

http://www.postgresql.org/doc

http://www.postgresql.org/docs/8.2/static/sql-update.html
Последний раздел Compatibility

UPDATE accounts SET (contact_last_name, contact_first_name) =
    (SELECT last_name, first_name FROM salesmen
     WHERE salesmen.id = accounts.sales_id);

Когда делаю по инструкции
UPDATE tableA SET (product, owf) = (SELECT form, fio FROM tableB WHERE tableB.kpr = tableA.npr);
ошибка в синтаксисе
ERROR:  syntax error at OR near "SELECT"
LINE 1: UPDATE tableA SET (product, owf) = SELECT form, fio FROM tab...

А вы внимательней почитайте

После приведённого вами примера написано

This is not currently implemented — the source must be a list of independent expressions.
т.е.
В настоящий момент это нереализовано - источник данных должен быть списком независимых выражений.

Так, а как же тогда это

Так, а как же тогда это сделать? извиняюсь, я в этом новичок. Есть ссылка на какой-то пример. Везде в документации имена таблиц указываются без кавычек, у меня на Postgresql 8.4, требует заключать имя таблицы в кавычки, иначе никак? Не подскажите какой-нибудь рабочий пример?

Имя в кавычки заключать нужно

Имя в кавычки заключать нужно только в том случае, если имя таблицы содержит не алфавитно-цифровые символы из ASCII. В остальных случаях - это не нужно, хотя разные долбанутые инструменты типа pgAdmin могут требовать странные вещи.

Как сделать? Способов много.
1. На больших объёмах данных можно сделать так:
CREATE TABLE tmp AS SELECT * FROM таблица_где_нужно_провести_обновления;
DELETE FROM tmp WHERE .... (условия удаления ненужных записей)
INSERT INTO tmp SELECT ... (запрос на вставку нужных записей)
BEGIN;
DROP TABLE старая_таблица;
ALTER TABLE tmp RENAME TO старая_таблица;
END;

Разумеется я здесь не указал ещё команды на создание необходимых индексов для tmp, если у вас есть индексы на старой_таблице. Это вы уже сами :)

Это будет намного правильнее, чем пытаться выполнить обновления на огромном количестве данных, для которых построены индексы. На нагруженных системах такая попытка может в итоге завесить сервер и привести к отказу в обслуживании клиентов.

2. Использовать хранимые процедуры. Код писать лень, так что опишу принцип. Делаете выборку тех записей, которые необходимо обновить, затем в цикле идёте по результатам этой выборки и по одной меняете записи в нужной таблице.

Спасибо большое вам за ответ

Спасибо большое вам за ответ и терпение. Сделал как вы сказали, с процедурами еще не разбирался.

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2023