Справка по каскадному удалению SQL (конкретный вопрос) - PullRequest
1 голос
/ 07 ноября 2008

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

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

1 Ответ

4 голосов
/ 07 ноября 2008

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

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

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

...