powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Клонировать таблицу.
8 сообщений из 8, страница 1 из 1
Клонировать таблицу.
    #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
Клонировать таблицу.
    #39223357
bochkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
ALTER SEQUENCE [ IF EXISTS ] имя RENAME TO новое_имя


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

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

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

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

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

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

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

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

и выкидываем задачу как нахрен ненужную. Порядок выборки из таблицы недетерминирован вообще то
...
Рейтинг: 0 / 0
Клонировать таблицу.
    #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
Клонировать таблицу.
    #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
8 сообщений из 8, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Клонировать таблицу.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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