в транзакции. Если нужно именно поменять имеющуюся партицию с отдельной таблицей местами, то можно сделать как-то так.
CREATE TABLE measurement (
city_id int not null,
logdate date not null,
peaktemp int,
unitsales int
) PARTITION BY RANGE (logdate);
CREATE TABLE measurement_y2006m02 PARTITION OF measurement
FOR VALUES FROM ('2006-02-01') TO ('2006-03-01');
CREATE TABLE measurement_y2006m03 PARTITION OF measurement
FOR VALUES FROM ('2006-03-01') TO ('2006-04-01');
CREATE TABLE measurement_y2006m04 PARTITION OF measurement
FOR VALUES FROM ('2006-04-01') TO ('2006-05-01');
-- Заполняем заменяемую позже партицию
insert into measurement values(1,'2006-03-02',0,0);
--Создаём таблицу для обмена с партицией
CREATE TABLE measurement_y2006m03_2
(LIKE measurement INCLUDING DEFAULTS INCLUDING CONSTRAINTS);
ALTER TABLE measurement_y2006m03_2 ADD CONSTRAINT y2006m03
CHECK ( logdate >= DATE '2006-03-01' AND logdate < DATE '2006-04-01' );
-- Заполняем новую таблицу чем нужно
insert into measurement_y2006m03_2 values(2,'2006-03-02',1,1), values(3,'2006-03-03',2,2);
--Меняем местами живую партицию и новую исправленную в транзакции (имена меняю по сути для красоты)
BEGIN;
ALTER TABLE measurement DETACH PARTITION measurement_y2006m03;
ALTER TABLE measurement_y2006m03 RENAME TO measurement_y2006m03_old;
ALTER TABLE measurement_y2006m03_2 RENAME TO measurement_y2006m03;
ALTER TABLE measurement ATTACH PARTITION measurement_y2006m03 FOR VALUES FROM ('2006-03-01') TO ('2006-04-01');
ALTER TABLE measurement_y2006m03_old RENAME TO measurement_y2006m03_2;
COMMIT;
Всё, поменяли местами.
Или нужно вообще пустую партиционированную таблицу (или партицию таблицы) заполнить даннымы?
В Оракле, например эффективнее производить вставку в пустую таблицу (внутрь партиции) а потом в секунду делать обмен without validation Путем простого инсерта в постргесе в партицированную таблицу, в моем понимании такого трюка не добиться
Обсуждают сегодня