У меня есть две таблицы (переименованные / отредактированные для иллюстративных целей) с отношением «многие ко многим» в базе данных 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
Я бы хотел удалить все во всех трех таблицах. Возможный?




Создайте процедуру хранения, в которой вы передаете идентификатор, а затем просто УДАЛИТЕ нужную строку в нужном вам порядке.
Таким образом, ваше приложение не привязано к точному порядку, который может измениться в будущем с редизайном БД. Вы также получаете дополнительный бонус, заключающийся в том, что хранимые процессы выполняются быстрее, чем отправка кучи запросов.
Хотя, если вам абсолютно необходим способ удаления зависимых таблиц при попытке удалить эту запись, вы должны использовать триггеры, но правило для триггеров: избегайте их, когда это возможно, если существует другое решение, используйте его. Так что, в конечном счете, использование Stored Proc - лучшее решение.