Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Клонировать таблицу. / 8 сообщений из 8, страница 1 из 1
24.04.2016, 13:13
    #39223342
Alex_Wong
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клонировать таблицу.
Добрый день.

Не получается правильно 'клонировать' таблицу с данными.
Например, база имеет схему gen и таблицу tb1 с данными :


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE TABLE gen.tb1
(
  id_tb1 serial NOT NULL,
  p text,
  CONSTRAINT tb1_pkey PRIMARY KEY (id_tb1)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE gen.tb1
  OWNER TO postgres;

-- данные : 
INSERT INTO gen.tb1 (p) VALUES ('aaa'),('bbb'),('ccc');




таблица tb1 получит последовательность "tb1_id_tb1_seq" для колонки serial "tb1.id_tb1"

Функция myfun(), которая делает, что хотел, но криво :


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
CREATE OR REPLACE FUNCTION gen.myfun()
  RETURNS void AS
$BODY$
DECLARE 
BEGIN

-- 1. Создаю временную таблицу tb2 со структурой tb1:
CREATE TABLE gen.tb2
(
  id_tb2 serial NOT NULL,
  p text,
  CONSTRAINT tb2_pkey PRIMARY KEY (id_tb2)
  )
WITH (
  OIDS=FALSE
);
ALTER TABLE gen.tb2
  OWNER TO postgres;


-- 2. Вношу в tb2 данные из tb1 :
INSERT INTO gen.tb2 (p ) SELECT p FROM gen.tb1 ORDER BY id_tb1 DESC;


-- 3. Удаляем старую таблицу tb1 и переименовываем tb2 в tb1 :
   DROP TABLE gen.tb1;
              -- если не переименовать имя CONSTRAINT tb2_pkey, то повторно 
              -- ф-ция не отработает, ошибка -> отношение "tb2_pkey" уже существует;
              -- не получается изменить 'gen.tb2_id_tb2_seq' на 'gen.tb1_id_tb1_seq'
              ALTER TABLE gen.tb2 RENAME COLUMN id_tb2 TO id_tb1;
              ALTER TABLE gen.tb2 RENAME CONSTRAINT tb2_pkey TO tb1_pkey;              
   ALTER TABLE gen.tb2 RENAME TO tb1;
END$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION gen.myfun()
  OWNER TO postgres;




т.е. получаю в 'новой' tb1 PK_колонку от временной - id_tb2 с "tb2_id_tb2_seq"
подскажите, пожалуйста, как правильно сделать.
...
Рейтинг: 0 / 0
24.04.2016, 14:13
    #39223357
bochkov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клонировать таблицу.
Код: sql
1.
ALTER SEQUENCE [ IF EXISTS ] имя RENAME TO новое_имя


а если просто в tb1 удалить колонку id_tb1 а потом заново добавить?
...
Рейтинг: 0 / 0
24.04.2016, 15:01
    #39223367
Alex_Wong
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клонировать таблицу.
Alex_Wong,

Наверное не точно выразился, нужно в исходной таблице ( tb1 ) изменить,
специфическим образом, порядок следования записей (~20к строк, шесть столбцов,
есть bytea) . Логику 'замеса' строк сделал, а вот сохранить полностью структуру исходной
таблицы, по примеру из myfun(), - не получилось.

Пока сделал так,

- в tb2 вношу записи из tb1 в нужной последовательности;
- удаляю tb1 со старыми данными;
- создаю пустую tb1;
- инсерт из tb2 в tb1;
- drop tb2.

не пухнет, но и не красиво ...
...
Рейтинг: 0 / 0
24.04.2016, 15:09
    #39223371
Alex_Wong
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клонировать таблицу.
bochkov,

может удалить в исходной таблице tb1 старые данные, потом
внести из временной, уже в нужной последовательности, и
дропнуть последнюю.
...
Рейтинг: 0 / 0
24.04.2016, 17:49
    #39223405
Alexius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клонировать таблицу.
Alex_Wong,

а откуда возникла такая странная задача упорядочить строки в таблице таким образом? командой cluster нельзя обойтись?
...
Рейтинг: 0 / 0
25.04.2016, 12:42
    #39223767
sanBez
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клонировать таблицу.
Alex_WongНаверное не точно выразился, нужно в исходной таблице ( tb1 ) изменить,
специфическим образом, порядок следования записей
Читаем https://ru.wikipedia.org/wiki/12_правил_Кодда

правило 1 последнее предложение

и выкидываем задачу как нахрен ненужную. Порядок выборки из таблицы недетерминирован вообще то
...
Рейтинг: 0 / 0
25.04.2016, 13:19
    #39223825
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клонировать таблицу.
sanBezAlex_WongНаверное не точно выразился, нужно в исходной таблице ( tb1 ) изменить,
специфическим образом, порядок следования записей
Читаем https://ru.wikipedia.org/wiki/12_правил_Кодда

правило 1 последнее предложение

и выкидываем задачу как нахрен ненужную. Порядок выборки из таблицы недетерминирован вообще то

Такое бывает полезно чтобы отсортировать записи в таблице на диске в порядке соответствующем порядку выборки в запросах.
Т.е. если 99% запросов order by ctime limit/offset - то если данные упорядочены более менее на диске по ctime выборки с сортировкой по ctime МОГУТ стать быстрее на порядки (если данные читаются с механических дисков а не с памяти или SSD).
Но вообще эта задача через CLUSTER команду решается.
Чем CLUSTER не устраивает автора топика не ясно.


--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
25.04.2016, 14:25
    #39223890
Alex_Wong
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клонировать таблицу.
Maxim Boguk,

да, именно для ускорения запросов

с командой cluster дела не имел, знакомлюсь ...

спасибо Вам и Alexius за подсказки


по исходной теме, для кругозора, не подскажете, как изменить (переопределить) название последовательности ?

- - -

Например, есть две с одинаковой структурой таблицы :

tb1 -- у неё есть последовательность "tb1_id_tb1_seq" по PK

tb2 -- у неё есть последовательность "tb2_id_tb2_seq" по PK

Хочу заменить tb1 на tb2, оставив последнюю :

- удалил tb1
- переименовал название таблицы с tb2 на tb1
- переименовал название CONSTRAINT и COLUMN
(так делал в приведенной выше ф-ции)

Получил tb1 с последовательностью "tb2_id_tb2_seq" (смотрю через pgAdmin).

Если смогу решить с последовательностью, будет ли такая tb1 вести себя аналогично исходной?

Спасибо.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Клонировать таблицу. / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]