Модификация таблицы «в памяти»

Функция

Определение оператора модификации таблицы «в памяти».

Спецификация
   
< модификация таблицы «в памяти» >::=
ALTER TABLE [имя схемы.]имя таблицы
[NOT] [IN-MEMORY] [[NO] AUTOSAVE] [[NO] AUTOLOAD]
Синтаксические правила
  1. Опция IN-MEMORY применима только к базовой таблице, т.е. < имя таблицы > должно ссылаться на базовую таблицу.

  2. Конструкция NOT IN-MEMORY применима только к таблице «в памяти», т.е. < имя таблицы > должно ссылаться на таблицу «в памяти».

  3. Отсутствие NOT IN-MEMORY или IN-MEMORY равнозначно конструкции NOT IN-MEMORY.

Общие правила
  1. Если задана опция IN-MEMORY, базовая таблица становится таблицей «в памяти» и активизируется. Если одновременно заданы опции AUTOLOAD и/или AUTOSAVE, то они применяются к созданной таблице «в памяти».

  2. Если задана опция NOT IN-MEMORY, таблица «в памяти» сохраняется на диск и становится базовой таблицей.

  3. Перевод таблицы из категории «в памяти» в категорию «базовая» выполняется только для предварительно сохранённой таблицы. Изменения в таблице «в памяти», выполненные после её сохранения, но перед выполнением оператора ALTER TABLE, будут утеряны.

    create or replace table tst (i int unique) in-memory;
    insert into tst(i) values(1);
    insert into tst(i) values(2);
    insert into tst(i) values(3);
    save table tst;
    
    // после модификации таблицы эти изменения будут утеряны
    insert into tst(i) values(4);
    insert into tst(i) values(5);
    
    alter table tst not in-memory;
    
    // эти изменения будут сохранены в базовой таблице
    update tst set i=10 where rowid=1;
  4. Базовая таблица, которая преобразуется в таблицу «в памяти», не должна иметь препятствующих этой операции ограничений (например, фразовых индексов, ссылок на себя и др.).

  5. Если опция IN-NEMORY не задана, и указанная таблица уже является таблицей «в памяти», то указание опции AUTOLOAD и/или AUTOSAVE устанавливает для таблицы «в памяти» эти свойства.

Пример
// создаём базовую таблицу
create or replace table tst (i int unique);
insert into tst(i) values(1);
insert into tst(i) values(2);
insert into tst(i) values(3);
select * from tst;
1
2
3
// пробуем применить к базовой таблице операцию сохранения
save table tst;
// получаем код завершения о недопустимости данной операции
// заменяем базовую таблицу на таблицу «в памяти»
alter table tst in-memory;
update tst set i=10 where rowid=1;
select * from tst;
10
2
3
// пробуем применить к модифицированной таблице операцию сохранения
save table tst;
// получаем нормальный код завершения