2008-11-06 1 views
1

У меня есть две таблицы (переименованные/рефакторированные для иллюстративных целей) с отношением Many-To-Many в базе данных HSQL. Я хочу, чтобы все было уничтожено при удалении от одной стороны многие-ко-многим (без запроса к таблице, это производительность критично)Каскадная помощь SQL (конкретный вопрос)

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

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 

Я в основном в nt, чтобы сделать это: «удалить из человека, где 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 

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

ответ

4

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

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

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

Смежные вопросы