CREATE GLOBAL TEMPORARY TABLE

Версии сервера

0.91.01.5.31.5.41.5.52.02.0.32.0.42.12.53.0
--------+++

Доступно в

DSQL, ESQL

Формат

Global Temporary Tables (GTTs)

Global temporary tables have persistent metadata, but their contents are transaction-bound (the default) or connection-bound. Every transaction or connection has its own private instance of a GTT, isolated from all the others. Instances are only created if and when the GTT is referenced, and destroyed upon transaction end or disconnection. To modify or remove a GTT’s metadata, ALTER TABLE and DROP TABLE can be used.

CREATE GLOBAL TEMPORARY TABLE name
   (column_def [, column_def | table_constraint ...])
   [ON COMMIT {DELETE | PRESERVE} ROWS]

Описание

/пока запощу оригинал - но это времмено, скоро постараюсь перевести на русский язык/

ON COMMIT DELETE ROWS

создает временную таблицу в которой записи хранятся до следующего COMMIT’a. (После COMMIT’а табличка становится чистой)

ON COMMIT PRESERVE ROWS

создает временную таблицу в которой записи хранятся до потери соединения. (После RECONNECT’a табличка становится чистой)

An EXTERNAL [FILE]

clause is not allowed on a global temporary table.

Restrictions: GTTs can be “dressed up” with all the features and paraphernalia of ordinary tables (keys, references, indices, triggers…) but there are a few restrictions:

GTTs and regular tables cannot reference one another.

A connection-bound (“PRESERVE ROWS”) GTT cannot reference a transaction-bound (“DELETE ROWS”) GTT.

Domain constraints cannot reference any GTT.

The destruction of a GTT instance at the end of its life cycle does not cause any before/after delete triggers to fire.

Пример

create global temporary table MyConnGTT (
  id int not null primary key,
  txt varchar(32),
  ts timestamp default current_timestamp
)
on commit preserve rows;

commit;

create global temporary table MyTxGTT (
  id int not null primary key,
  parent_id int not null references MyConnGTT(id),
  txt varchar(32),
  ts timestamp default current_timestamp
);

commit;

Замечание

В существующей базе данных не всегда легко отличить обычную табличку от GTT, или “GTT со временем жизни транзакция” от “GTT со временем жизни коннект”, что бы найти отличия в таблиц, используйте этот запрос:

select t.rdb$type_name
  from rdb$relations r
  join rdb$types t on r.rdb$relation_type = t.rdb$type
  where t.rdb$field_name = 'RDB$RELATION_TYPE'
  and r.rdb$relation_name = 'TABLENAME'

Или, для просмотра всех Ваших зависимостей:

select r.rdb$relation_name, t.rdb$type_name
  from rdb$relations r
  join rdb$types t on r.rdb$relation_type = t.rdb$type
  where t.rdb$field_name = 'RDB$RELATION_TYPE'
  and coalesce (r.rdb$system_flag, 0) = 0

См. также

Источник

http://www.firebirdsql.org/refdocs/langrefupd21-ddl-table.html

Обсуждение