Здравствуйте! Скажите как сначала перенести данные из одной таблицы А, в таблицу 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
> ERROR: INSERT has more target COLUMNS than expressions
ОШИБКА: INSERT содержит больше колонок, чем выражения
А если попробовать:
Спасибо сейчас буду
Спасибо сейчас буду разбираться с update
UPDATE "tableA" SET (product,
Ошибка, что отсутствует пункт From для tableb
Разумеется. А где вы в
Разумеется. А где вы в руководстве такой синтаксис нашли?
http://www.postgresql.org/doc
http://www.postgresql.org/docs/8.2/static/sql-update.html
Последний раздел Compatibility
Когда делаю по инструкции
UPDATE tableA SET (product, owf) = (SELECT form, fio FROM tableB WHERE tableB.kpr = tableA.npr);
ошибка в синтаксисе
А вы внимательней почитайте
После приведённого вами примера написано
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. Использовать хранимые процедуры. Код писать лень, так что опишу принцип. Делаете выборку тех записей, которые необходимо обновить, затем в цикле идёте по результатам этой выборки и по одной меняете записи в нужной таблице.
Спасибо большое вам за ответ
Спасибо большое вам за ответ и терпение. Сделал как вы сказали, с процедурами еще не разбирался.