powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Поменялись имена колонок и таблиц
3 сообщений из 3, страница 1 из 1
Поменялись имена колонок и таблиц
    #35549767
Robert Ayrapetyan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите как грамотно поступить. Есть БД, с миллионами записей в каждой таблице. Поменялись названия таблиц, некоторых колонок в них, в том числе и Foregin Key-колонок. Изменились хранимые процедуры и их называния.

Каков правильный алгоритм действий: удалить все старые хранимые процедуры, вьюхи, индексы. Это понятно. Но как быть со связыванием таблиц? Нет ли какого механизма автоматического при переименовании колонок чтоб foreign keys тоже обновлялись?
...
Рейтинг: 0 / 0
Поменялись имена колонок и таблиц
    #35550049
Фотография Степан H.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошим решением будет создать НОВУЮ базу с НОВОЙ структурой и НОВОЙ логикой, а потом импортировать туда данные из сторой базы.

Или пересобрать все ключи вручную.
...
Рейтинг: 0 / 0
Поменялись имена колонок и таблиц
    #35550202
tkopets
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
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.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
CREATE TABLE fktest_a(a_id serial NOT NULL PRIMARY KEY);

CREATE TABLE fktest_b
(
   b_id serial NOT NULL, 
   a_id integer NOT NULL, 
    PRIMARY KEY (b_id), 
    FOREIGN KEY (a_id) REFERENCES fktest_a (a_id)
);

INSERT INTO fktest_a VALUES( 1 );
INSERT INTO fktest_a VALUES( 2 );
INSERT INTO fktest_a VALUES( 3 );

INSERT INTO fktest_b VALUES( 1 , 3 );
INSERT INTO fktest_b VALUES( 2 , 1 );
INSERT INTO fktest_b VALUES( 3 , 2 );
INSERT INTO fktest_b VALUES( 4 , 2 );
INSERT INTO fktest_b VALUES( 5 , 3 );
-- INSERT INTO fktest_b VALUES(6,4);    --  fk violation


ALTER TABLE fktest_a RENAME TO fka;
ALTER TABLE fka RENAME a_id  TO aid;

ALTER TABLE fktest_b RENAME TO fkb;
ALTER TABLE fkb RENAME a_id  TO aid;
ALTER TABLE fkb RENAME b_id  TO bid;




INSERT INTO fkb VALUES( 6 , 4 );    

-- получим странный error (но только в той сесии в котрой мы делали RENAME). Но, если открыть новую сесию к БД, то все будет отлчино (получим наш error).

-- странный error
-- ERROR: relation "public.fktest_a" does not exist
-- SQL state: 42P01
-- Context: SQL statement "SELECT 1 FROM ONLY "public"."fktest_a" x WHERE "a_id" OPERATOR(pg_catalog.=) $1 FOR SHARE OF x"

-- в новой сесии уже получим то, что надо
-- ERROR: insert or update on table "fkb" violates foreign key constraint "fktest_b_a_id_fkey"
-- SQL state: 23503
-- Detail: Key (aid)=(4) is not present in table "fka".


-- clean-up
-- DROP TABLE fkb;
-- DROP TABLE fka;
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Поменялись имена колонок и таблиц
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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