powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / нужен хитрый апдэйт на две таблицы
8 сообщений из 8, страница 1 из 1
нужен хитрый апдэйт на две таблицы
    #39760483
sstatistic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.


Есть две таблицы.



Код: sql
1.
2.
3.
4.
5.
CREATE t1 (id int,val int);
ALTER TABLE t1 ADD CONSTRAINT t1_pk PRIMARY KEY (id,val);

CREATE t2 (id int,val int);
ALTER TABLE t2 ADD CONSTRAINT t2_fk FOREIGN KEY (id,val) REFERENCES t1 (id,val) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE CASCADE;





При попытке UPDATE поля val в таблице t1 пишет:
ОШИБКА: INSERT или UPDATE в таблице "t1" нарушает ограничение внешнего ключа "t2_fk"


Как сделать UPDATE поля val в таблице t1 ?
...
Рейтинг: 0 / 0
нужен хитрый апдэйт на две таблицы
    #39760484
sstatistic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
проапдэйтить сразу обе таблицы тоже не получается - ни один update не проходит.
...
Рейтинг: 0 / 0
нужен хитрый апдэйт на две таблицы
    #39760495
vsl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vsl
Гость
sstatistic
Код: sql
1.
ALTER TABLE t2 ADD CONSTRAINT t2_fk FOREIGN KEY (id,val) REFERENCES t1 (id,val) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE CASCADE;


При попытке UPDATE поля val в таблице t1 пишет:
ОШИБКА: INSERT или UPDATE в таблице "t1" нарушает ограничение внешнего ключа "t2_fk"

Как сделать UPDATE поля val в таблице t1 ?
Надо было создавать t2_fk с ON UPDATE CASCADE.
...
Рейтинг: 0 / 0
нужен хитрый апдэйт на две таблицы
    #39760518
jan2ary
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sstatistic,

Первичніьй ключ в хорошо спроектированньіх схемах не принято обновлять.
...
Рейтинг: 0 / 0
нужен хитрый апдэйт на две таблицы
    #39760528
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пересоздайте FK как deferrable
Код: sql
1.
ALTER TABLE t2 ADD CONSTRAINT t2_fk FOREIGN KEY (id,val) REFERENCES t1 (id,val) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE CASCADE deferrable;



Затем
Код: sql
1.
2.
begin;
set constraints t2_fk deferred ;


И до коммита вы сможете временно нарушать целостность FK. Потому что проверка ссылок будет отложена до момента перед коммитом.


Либо сделайте insert нужной строки в t1 в том виде, в котором она должна быть после update, затем обновите t1 - новое значение для ключа уже будет и fk согласится жить, затем удалите старую версию строки. Такой update вручную.
...
Рейтинг: 0 / 0
нужен хитрый апдэйт на две таблицы
    #39760734
sstatistic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vslsstatistic
Код: sql
1.
ALTER TABLE t2 ADD CONSTRAINT t2_fk FOREIGN KEY (id,val) REFERENCES t1 (id,val) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE CASCADE;


При попытке UPDATE поля val в таблице t1 пишет:
ОШИБКА: INSERT или UPDATE в таблице "t1" нарушает ограничение внешнего ключа "t2_fk"

Как сделать UPDATE поля val в таблице t1 ?
Надо было создавать t2_fk с ON UPDATE CASCADE.

Спасибо.
Тоже думал над таким вариантом.
Оставлю его на крайний случай.
...
Рейтинг: 0 / 0
нужен хитрый апдэйт на две таблицы
    #39760735
sstatistic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Melkijпересоздайте FK как deferrable
Код: sql
1.
ALTER TABLE t2 ADD CONSTRAINT t2_fk FOREIGN KEY (id,val) REFERENCES t1 (id,val) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE CASCADE deferrable;



Затем
Код: sql
1.
2.
begin;
set constraints t2_fk deferred ;


И до коммита вы сможете временно нарушать целостность FK. Потому что проверка ссылок будет отложена до момента перед коммитом.


Либо сделайте insert нужной строки в t1 в том виде, в котором она должна быть после update, затем обновите t1 - новое значение для ключа уже будет и fk согласится жить, затем удалите старую версию строки. Такой update вручную.


Благодарю за ответ.

Вариант интересный, сейчас его протестирую.
...
Рейтинг: 0 / 0
нужен хитрый апдэйт на две таблицы
    #39761220
PgSQLanonymous3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sstatistic, т.е. если у Вас есть:

Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE t1 (id int, val int);
ALTER TABLE t1 ADD CONSTRAINT t1_pk PRIMARY KEY (id, val);
CREATE TABLE t2 (id int, val int);
ALTER TABLE t2 ADD CONSTRAINT t2_fk FOREIGN KEY (id, val) REFERENCES t1 (id, val) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE CASCADE;

INSERT INTO t1 VALUES (1, 1), (2, 1);
INSERT INTO t2 VALUES (1, 1), (2, 1);


Почему бы просто не сделать так:
Код: sql
1.
2.
3.
4.
WITH u_t1 AS (
UPDATE t1 SET val = 2 WHERE id = 1 
)
UPDATE t2 SET val = 2 WHERE id = 1;
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / нужен хитрый апдэйт на две таблицы
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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