Ответ 1
Лучший способ сделать это - создать новую таблицу с желаемой схемой, а после этого сделать INSERT.... SELECT с данными из старой таблицы.
Затем отмените текущую таблицу и переименуйте новую с помощью ALTER TABLE.
Postgre поддерживает эту операцию, как показано ниже:
ALTER TABLE name
SET SCHEMA new_schema
В Redshift операция не будет работать. Есть ли способ сделать это?
Я попытался обновить pg_class, чтобы установить relnamespace (идентификатор схемы) для таблицы, для которой нужна учетная запись суперпользователя, а usecatupd - в таблице pg_shadow. Но я получил разрешение отклонить ошибку. Единственной учетной записью, которая может изменить системную таблицу pg, является rdsdb.
server=# select * from pg_user;
usename | usesysid | usecreatedb | usesuper | usecatupd | passwd | valuntil | useconfig
------------+----------+-------------+----------+-----------+----------+----------+----------------------------------
rdsdb | 1 | t | t | t | ******** | |
myuser | 100 | t | t | f | ******** | |
Итак, действительно ли красное смещение не дает на это разрешения?
Лучший способ сделать это - создать новую таблицу с желаемой схемой, а после этого сделать INSERT.... SELECT с данными из старой таблицы.
Затем отмените текущую таблицу и переименуйте новую с помощью ALTER TABLE.
Самый быстрый способ сделать это сейчас заключается в следующем:
CREATE TABLE my_new_schema.my_table (LIKE my_old_schema.my_table);
ALTER TABLE my_new_schema.my_table APPEND FROM my_old_schema.my_table;
DROP TABLE my_old_schema.my_table;
Данные для my_old_schema.my_table
просто переназначаются, чтобы в этом случае принадлежать my_new_schema.my_table
. Гораздо быстрее, чем делать INSERT INTO
.
Обратите внимание, что вам, возможно, придется удалить и воссоздать любые представления, которые зависят от my_old_schema.my_table
. ОБНОВЛЕНИЕ: Если вы делаете это регулярно, вы должны создавать свои представления, используя WITH NO SCHEMA BINDING
и они будут продолжать указывать на правильную таблицу без необходимости WITH NO SCHEMA BINDING
создания.
Вы можете создать новую таблицу с помощью
CREATE TABLE schema1.tableName(LIKE schema2.tableName ВКЛЮЧАЯ ПО УМОЛЧАНИЮ);
а затем скопируйте содержимое таблицы из одной схемы в другую с помощью инструкции INSERT INTO
а затем DROP TABLE, чтобы удалить таблицу.
Вот как я это делаю.
- Удалить, если у вас уже есть одна резервная копия
DROP TABLE IF EXISTS TABLE_NAME_BKP CASCADE;
- Создайте две резервные копии, одну для работы и в конце удалите, а еще одну - настоящая резервная копия
SELECT * INTO TABLE_NAME_BKP FROM TABLE_NAME;
SELECT * INTO TABLE_NAME_4_WORK FROM TABLE_NAME;
--We может также выполнить приведенный ниже ALTER, но он содержит имя ограничения первичного ключа, следовательно, вы не можете создать новую таблицу с такими же именами ограничений
ALTER TABLE TABLE_NAME RENAME TO TABLE_NAME_4_WORK;
- Убедитесь, что вы скопировали
SELECT COUNT(*) FROM TABLE_NAME;
SELECT COUNT(*) FROM TABLE_NAME_4_WORK;
- создать новую схему таблицы
DROP TABLE IF EXISTS TABLE_NAME CASCADE;
CREATE TABLE TABLE_NAME (
ID varchar(36) NOT NULL,
OLD_COLUMN varchar(36),
NEW COLUMN_1 varchar(36)
)
compound sortkey (ID, OLD_COLUMN, NEW COLUMN_1);
ALTER TABLE TABLE_NAME
ADD CONSTRAINT PK__TAB_NAME__ID
PRIMARY KEY (id);
- копировать данные из старого в новое
INSERT INTO TABLE_NAME (
id,
OLD_COLUMN)
(SELECT
id,
OLD_COLUMN FROM TABLE_NAME_4_WORK)
- Удалите рабочий стол TABLE_NAME_4_WORK.
DROP TABLE TABLE_NAME_4_WORK;
- СРАВНИТЕ BKP И НОВЫЕ ТАБЛИЦЫ, И СОХРАНИТЕ BKP ТАБЛИЦА ДЛЯ ИНОГДА.
SELECT COUNT(*) FROM TABLE_NAME_BKP;
SELECT COUNT(*) FROM TABLE_NAME;