====== CREATE GLOBAL TEMPORARY TABLE ======
===== Версии сервера =====
^ 0.9 ^ 1.0 ^ 1.5.3 ^ 1.5.4 ^ 1.5.5 ^ 2.0 ^ 2.0.3 ^ 2.0.4 ^ 2.1 ^ 2.5 ^ 3.0 ^
| - | - | - | - | - | - | - | - | + | + | + |
===== Доступно в =====
[[raznovidnosti_jazyka_sql|DSQL]], [[raznovidnosti_jazyka_sql|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