powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Удаление записей из двух таблиц, связанных по ключу
8 сообщений из 8, страница 1 из 1
Удаление записей из двух таблиц, связанных по ключу
    #39183505
Adis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

не подскажите, как написать sql-запрос для удаления записей из двух таблиц A и B, при этом:
в таблице A присутствует FK из таблицы B (то есть, сначала нужно удалить записи из таблицы А, потом - из B)

чтобы удалить записи из таблицы B, нужно знать значения из таблицы A (то есть delete from B where B.id in (select b_id from A)). То есть невозможно удалить записи из B, предварительно удалив записи из А - противоречие с предыдущим пунктом.

В принципе, в MsSQL можно было бы сделать так:
DELETE FROM B LEFT JOIN A ON B.id = A.b_id;

но в postgresql, как я понял из документации , это не получиться. Не подскажите, как быть?
...
Рейтинг: 0 / 0
Удаление записей из двух таблиц, связанных по ключу
    #39183535
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Adis,

вот проблему-то возвел. удалил из одной таблицы, потом из другой, разом из обеих, или транкейт. какая тебе разница, кто там in, а кто join, если они уже связаны fk.
...
Рейтинг: 0 / 0
Удаление записей из двух таблиц, связанных по ключу
    #39183568
Adis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
p2.,

то есть, Вы хотите сказать, что нужно делать так:

Код: plsql
1.
2.
DELETE FROM A
WHERE A.b_id IN (select b_id from A where ..)



Код: plsql
1.
2.
DELETE FROM B
WHERE B.id IN (select b_id from A where ..)



?
...
Рейтинг: 0 / 0
Удаление записей из двух таблиц, связанных по ключу
    #39183571
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Adis,

если FK on delete restrict, то да, наверное сперва на б, потом на а. а если on delete cascade, то дилитим на а а в б записи будут дилитится автомагически. так какой кострейнт?
...
Рейтинг: 0 / 0
Удаление записей из двух таблиц, связанных по ключу
    #39183582
Adis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вы знаете, там как-то (заранее извиняюсь - я SQL начал осваивать только вчера):

Код: sql
1.
2.
3.
4.
alter table A
   add constraint rel_permis foreign key (permission_id)
      references permission (permission_id)
      on delete restrict on update restrict;



Код: plsql
1.
2.
3.
4.
alter table A
   add constraint rel_route_2_permission_route foreign key (route_id)
      references route (route_id)
      on delete restrict on update restrict;



Код: sql
1.
2.
3.
4.
alter table B
   add constraint rel_route_type_2_route foreign key (route_type_id)
      references route_type (route_type_id)
      on delete restrict on update restrict;
...
Рейтинг: 0 / 0
Удаление записей из двух таблиц, связанных по ключу
    #39183602
Adis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я написал скрипт - сначала удаляю из B, потом из А:

Код: plsql
1.
2.
3.
4.
5.
6.
DELETE FROM B
WHERE id IN (select b_id from A where ..);


DELETE FROM A
WHERE b_id IN (select b_id from A where ..);



но здесь мне сругнулась:
Код: xml
1.
2.
3.
ОШИБКА:  UPDATE или DELETE в таблице "B" нарушает ограничение внешнего ключа "rel_route_2_permission_route" таблицы "A"
DETAIL:  На ключ (route_id)=(357) всё ещё есть ссылки в таблице "A".
********** Ошибка **********
...
Рейтинг: 0 / 0
Удаление записей из двух таблиц, связанных по ключу
    #39183624
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можете сюда подумать:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
WITH to_del AS -- оддин раз берем список
    (select b_id from B where ..)
,del_slave AS (DELETE FROM A
  WHERE A.b_id IN (select b_id from to_del)
/*RETURNING ...*/
)
DELETE FROM B
WHERE B.id IN (select b_id from to_del)



хотя , в действительности все не так, как на самом деле:
-- там, в определении констрайнта, бывают ещё словечки про DEFERRABLE
...
Рейтинг: 0 / 0
Удаление записей из двух таблиц, связанных по ключу
    #39183632
Adis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
виноват, там как-то так:

Код: plsql
1.
2.
3.
4.
ALTER TABLE A
  ADD CONSTRAINT rel_route_2_permission_route FOREIGN KEY (b_id)
      REFERENCES B (id) MATCH SIMPLE
      ON UPDATE RESTRICT ON DELETE RESTRICT;
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Удаление записей из двух таблиц, связанных по ключу
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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