Удаление записи

Функция

Определение оператора удаления записей таблицы.

Спецификация

   
< запрос удаления >::=
< соединяемая таблица >::=

Синтаксические правила

  1. Допустимые привилегии для < имени объекта > должны включать DELETE.

  2. Для соединяемых таблиц (с конструкцией JOIN) привилегия DELETE требуется только для левых таблиц соответствующих запросов, для правых таблиц требуется привилегия SELECT.

  3. Таблица с < именем таблицы > не должна быть только считываемой таблицей (т.е. системной таблицей), < имя представления > не должно ссылаться на необновляемое представление (представление, основанное на выборке из нескольких таблиц). В данном случае, если < WHERE-спецификация > не задана, удаляются все записи.

    Удаление всех записей таблицы:

    DELETE FROM Person;
  4. Если < WHERE-спецификация > задана, то она применяется к каждой строке таблицы (представления), и строки, для которых < WHERE-спецификация > истинна, удаляются.

    Удаление по условию выборки:
    delete from auto where color ='green';
    
    Удаление из таблицы TST дубликатов поля I:
    delete from tst where rowid in (select rowid from tst m1 where exists (select * from tst m2 where m1.i=m2.i and m1.rowid <  m2.rowid));
  5. Если задана конструкция JOIN, то она должна содержать список реальных или порожденных таблиц, соединяемых с таблицей, из которой удаляются строки. Условие соединения всех таблиц задается в < WHERE-спецификации >.

    DELETE FROM Auto JOIN Person 
     WHERE auto.personid=person.personid
       AND auto.color in ('BLACK','WHITE');

    Примечание

    Синтаксис оператора DELETE с соединяемыми таблицами не соответствует стандарту SQL, т.к. в этом стандарте не прописан механизм удаления записей при наличии соединяемых таблиц. Согласно стандарту SQL можно удалять напрямую или через обновляемое представление записи только из одной таблицы или выборки из неё без соединения с другими таблицами.

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

Общие правила

  1. Если при выполнении операции удаления (в том числе и каскадной) встречается заблокированная запись, то выдается код завершения 135 («Строка таблицы заблокирована другим пользователем»), даже если задан модификатор WAIT.

  2. Удаление записей с использованием соединения таблиц происходит следующим образом:

    • выполняется соединения таблиц;

    • из полученного результирующего набора удаляются те записи, которые удовлетворяют < WHERE-спецификации >.

  3. Параметр < время > задает максимально допустимую продолжительность выполнения запроса (от 1 до 65535 сек.). Если запрос в отведенное для него время не был выполнен, его обработка прекращается с выдачей соответствующего кода завершения.

  4. Конструкция WITH PRIORITY < приоритет > устанавливает заданный приоритет (значение в диапазоне от 0 до 255). Если задать приоритет больше текущего приоритета пользователя, от чьего имени подается запрос, то выдается код завершения 1022 («Нарушение привилегий»).

  5. Конструкция WITH PRIORITY < приоритет > назначает приоритет только тому запросу, в котором она указана. На приоритет любых последующих запросов она не влияет.

  6. Для таблицы, созданной с атрибутом NODE, < запрос удаления > с локального сервера недоступен.

  7. Разрешается удалять записи со спецификацией действия NO ACTION (RESTRICT) и ссылающиеся на самих себя.

  8. Для таблиц «в памяти» < запрос удаления > в режиме OPTIMISTIC не поддерживается.

    Тестовые данные:
    
    Пусть имеются таблицы сотрудников (persons), отделов (departments), этажей (floors).
    Таблица persons связана с departments по номеру отдела (d_id), departments связана с floors по номеру этажа (num_f).
    
    create or replace table floors (num_f int, f_name char(20));
    insert into floors values (1, 'First');
    insert into floors values (2, 'Second');
    insert into floors values (3, 'Third');
    insert into floors values (4, 'Fourth');
    insert into floors values (5, 'Fifth');
    insert into floors values (6, 'Sixth');
    
    create or replace table departments(d_id int, d_name char(20), num_f int);
    insert into departments values (1, 'Sales',           1);
    insert into departments values (2, 'IT-technologies', 3);
    insert into departments values (3, 'Finance',         4);
    insert into departments values (4, 'Management',      4);
    insert into departments values (5, 'Design',          3);
    
    create or replace table persons(p_id int, p_name char (20), d_id int);
    insert into persons values (1, 'John',  3);
    insert into persons values (2, 'Mary',  2);
    insert into persons values (3, 'Kate',  4);
    insert into persons values (4, 'Jack',  2);
    insert into persons values (5, 'Peter', 7);
    insert into persons values (6, 'Ann',   5);
    
    Удалить из таблицы departments отделы, которые находятся на этаже 'First'.
    
    DELETE FROM departments d JOIN floors f 
     WHERE (f.num_f = d.num_f) AND (f.f_name = 'First');
    
    SELECT * FROM departments;
    
      D_ID        D_NAME                NUM_F
      ----        ------                -----
     |          2|IT-technologies      |          3|
     |          3|Finance              |          4|
     |          4|Management           |          4|
     |          5|Design               |          3|
    
    В результирующем наборе в списке отделов (departments) теперь не содержится отдел 'Sales', т.к. он находится на этаже 'First'.