Справка по каскадному удалению SQL (конкретный вопрос)

У меня есть две таблицы (переименованные / отредактированные для иллюстративных целей) с отношением «многие ко многим» в базе данных HSQL. Я хочу, чтобы все стиралось при удалении с одной стороны отношения "многие ко многим" (без запроса таблицы; это критично для производительности)

Вот мои основные таблицы:

CREATE TABLE PERSON
(
    PERSON_ID INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, 
    NAME VARCHAR(50)
)

CREATE TABLE JOB
(
    JOB_ID INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, 
    NAME VARCHAR(50)
)

Вот мой соединительный стол:

CREATE TABLE JOB_PERSON
(
    PERSON_ID INTEGER, 
    JOB_ID INTEGER
)

Вот мои ограничения:

ALTER TABLE JOB_PERSON ADD 
    CONSTRAINT FK_PERSON_JOB FOREIGN KEY(PERSON_ID) 
    REFERENCES PERSON ON DELETE CASCADE ON UPDATE CASCADE 

ALTER TABLE JOB_PERSON ADD
    CONSTRAINT FK_JOB_PERSON FOREIGN KEY(JOB_ID) 
    REFERENCES JOB ON DELETE CASCADE ON UPDATE CASCADE

Я в основном хочу сделать это: «удалить от человека, где person_id = 0» и удалить все из PERSON, JOB_PERSON и JOB, если сущность JOB будет осиротевшей (больше не упоминается в таблице многие ко многим)

Возможно ли это без запроса базы данных? Когда я удаляю, он удаляется только из PERSON и JOB_PERSON. Как вы, наверное, заметили, мне не хватает навыков работы с sql.

Вот фиктивные данные, с которыми я играл:

insert into person values(null,'Arthur');
insert into person values(null,'James');
insert into job values(null, 'Programmer')
insert into job values(null, 'Manager')
insert into job_person values(0,0);
insert into job_person values(0,1);
insert into job_person values(1,1);

Итак, если я введу оба этих утверждения:

delete from person where person_id=0
delete from person where person_id=1

Я бы хотел удалить все во всех трех таблицах. Возможный?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
181
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Создайте процедуру хранения, в которой вы передаете идентификатор, а затем просто УДАЛИТЕ нужную строку в нужном вам порядке.

Таким образом, ваше приложение не привязано к точному порядку, который может измениться в будущем с редизайном БД. Вы также получаете дополнительный бонус, заключающийся в том, что хранимые процессы выполняются быстрее, чем отправка кучи запросов.

Хотя, если вам абсолютно необходим способ удаления зависимых таблиц при попытке удалить эту запись, вы должны использовать триггеры, но правило для триггеров: избегайте их, когда это возможно, если существует другое решение, используйте его. Так что, в конечном счете, использование Stored Proc - лучшее решение.

Другие вопросы по теме