Содержание
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 |
---|---|---|---|---|---|---|---|---|---|---|
- | - | - | - | - | - | - | - | + | + | + |
Доступно в
Формат
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
Обсуждение