16.20 - UPDATE (ANSI System-Timeフォーム) - Teradata Vantage NewSQL Engine

Teradata Vantage™ ANSIテンポラル テーブル サポート

prodname
Teradata Database
Teradata Vantage NewSQL Engine
vrm_release
16.20
category
プログラミング リファレンス
featnum
B035-1186-162K-JPN

目的

system-timeテーブルの既存の行にある列値を変更します。

構文

system-timeテーブルで使用するときにUPDATE文に特別な追加のテンポラル構文はありません。この構文は、非テンポラル テーブルに使用される構文と同一です。この構文については、SQLデータ操作言語

使用上の注意

UPDATE文の構文はsystem-timeテーブルでも非テンポラル テーブルでも同じですが、効果は異なります。非テンポラル テーブルで行を変更するときに行の元の情報は残りません。元の行が削除され、新しい行に置き換えられたのと同じ状態と考えることができます。

System-timeテーブルは、元の行をテーブルから文字どおり削除し、変更された情報を反映するために新しい行をテーブルに挿入することによって、この暗黙的な状態を明示的にします。行はsystem-timeテーブルから物理的に削除されたのではないため、元の行はシステム時間でクローズされ、変更前に存在したテーブルの状態を示すスナップショットとして、無効なままテーブルに残ります。

system-timeテーブル内のクローズ行に影響しないように更新します。

SET句にSYSTEM_TIME派生期間列の開始または終了列構成要素を含めることはできません。

以下の例では、オープン行とクローズ行の混合を含むemployee_systimeという名前の次のシステムのバージョン情報を含むsystem-timeテーブルに対して問合わせが実行されると仮定しています。

 eid ename  deptno                        sys_start                          sys_end
---- ------ ------ -------------------------------- --------------------------------
1002 Ash       333 2003-07-01 12:11:00.000000-08:00 9999-12-31 23:59:59.999999+00:00
1005 Alice     222 2004-12-01 00:12:23.120000-08:00 2005-05-01 12:00:00.450000-08:00
1004 Fred      222 2002-07-01 12:00:00.350000-08:00 2005-05-01 12:00:00.350000-08:00
1001 Sania     111 2002-01-01 00:00:00.000000-08:00 9999-12-31 23:59:59.999999+00:00
1003 SRK       111 2004-02-10 00:00:00.000000-08:00 2006-03-01 00:00:00.000000-08:00
1004 Fred      555 2005-05-01 12:00:00.350000-08:00 9999-12-31 23:59:59.999999+00:00
1005 Alice     555 2005-05-01 12:00:00.450000-08:00 9999-12-31 23:59:59.999999+00:00


システム時間のあるテーブルで、UPDATEの対象になるのは、オープン行だけです。テンポラル修飾子のない簡単なSELECTでテーブルのオープン行が返されます。

SELECT * FROM employee_systime;

 eid ename  deptno                        sys_start                          sys_end
---- ------ ------ -------------------------------- --------------------------------
1002 Ash       333 2003-07-01 12:11:00.000000-08:00 9999-12-31 23:59:59.999999+00:00
1001 Sania     111 2002-01-01 00:00:00.000000-08:00 9999-12-31 23:59:59.999999+00:00
1004 Fred      555 2005-05-01 12:00:00.350000-08:00 9999-12-31 23:59:59.999999+00:00
1005 Alice     555 2005-05-01 12:00:00.450000-08:00 9999-12-31 23:59:59.999999+00:00

UPDATE employee_systime SET deptno=888 WHERE ename=’Ash’;


簡単なSELECTで行が予測どおりに変更されたことを示しています。system-time期間の開始時間はUPDATEの時間を記録することに注意してください。変更がデータベースに通知されて有効になるのはこの開始時間からだからです。

 eid ename  deptno                        sys_start                          sys_end
---- ------ ------ -------------------------------- --------------------------------
1002 Ash       888 2014-02-23 22:27:56.540000-08:00 9999-12-31 23:59:59.999999+00:00
1001 Sania     111 2002-01-01 00:00:00.000000-08:00 9999-12-31 23:59:59.999999+00:00
1004 Fred      555 2005-05-01 12:00:00.350000-08:00 9999-12-31 23:59:59.999999+00:00
1005 Alice     555 2005-05-01 12:00:00.450000-08:00 9999-12-31 23:59:59.999999+00:00


オープンおよびクローズ行を示すテンポラルSELECTは、元の行がまだテーブルに存在することを示しています。元の行はクローズされており、古い行のシステム時間の終了境界は変更時に設定されています。これはその行の値がデータベースで適用されたり、有効になることを終了した時間です。

SELECT * FROM employee_systime 
FOR SYSTEM_TIME BETWEEN TIMESTAMP'1900-01-01 22:14:02.820000-08:00' and CURRENT_TIMESTAMP 
WHERE ename=’Ash’;


 eid ename  deptno                        sys_start                          sys_end
---- ------ ------ -------------------------------- --------------------------------
1002 Ash       888 2014-02-23 22:27:56.540000-08:00 9999-12-31 23:59:59.999999+00:00
1002 Ash       333 2003-07-01 12:11:00.000000-08:00 2014-02-23 22:27:56.540000-08:00

このようにして、system-timeテーブルはテーブルの行への変更の詳細な履歴を維持しています。