2015-09-04 2 views
3

В основном я хочу, чтобы это сделать:Как заменить таблицу в postgres?

begin; 
lock table a; 
alter table a rename to b; 
alter table a1 rename to a; 
drop table b; 
commit; 

т.е. регулировки усиления и заменить старую таблицу, пока никто не имеет к нему доступ.

+0

Можете ли вы уточнить, где вы застряли или чего не можете достичь? –

+0

Не так много. У меня возникла ошибка, когда я попробовал ее в командной строке, но, возможно, была существующая таблица или что-то, что вызвало ее, и я неверно истолковал ее. Поэтому у вас есть лучший ответ. ;-) – user3416742

+3

Затем, пожалуйста, укажите ошибку, которую вы получаете. –

ответ

5

Simpler:

BEGIN; 
DROP TABLE a; 
ALTER TABLE a1 RENAME TO a; 
COMMIT; 

DROP TABLE приобретает ACCESS EXCLUSIVE замок на столе в любом случае. Явная команда LOCK не лучше. И переименование мертвого парня просто пустая трата времени.

Что происходит с параллельными транзакциями, пытающимися получить доступ к таблице? Это не так просто, прочитать:

объясняет, почему вы, возможно, видели сообщения об ошибках, как это:

ERROR: could not open relation with OID 123456 
+4

Также обратите внимание, что ни это, ни оригинальное решение не сохранит ограничения FOREIGN KEY, ссылающиеся на таблицу, представления, ссылающиеся на таблицу, и т. Д. «DROP» не удастся. Если вы «DROP ... CASCADE», то реферирующие представления, ограничения и т. Д. Отбрасываются и не будут воссозданы при создании/переименовании таблицы замещения на место. В настоящее время нет удобного способа «обмена» двумя таблицами и ограничения FK и т. Д. –

0

Создание SQL-подпорку, внести изменения вам нужно непосредственно в файле backup.sql и восстановить базу данных. Я использовал этот трюк, добавив INHERIT для группы таблиц (Postgres dbms), чтобы удалить унаследованные поля из подтаблицы.

Смежные вопросы