Teradata で 1 つの新しい列を作成し、別の列からこの新しい列にデータを移動しました。その後、古い列を削除しました。私が今やりたいことは、古い列があったテーブルの同じ場所に新しい列を移動することです。お聞きしたいのですが、それは可能ですか?
2 に答える
これはあなたの前の質問に関連しているので、私は同じ文脈で答えようとします。
いいえ、事後に列の順序を変更することはできません。既存のテーブルに新しい列を「追加」すると、テーブルの説明の最後に定義されます。物理テーブルに特定の順序で列を表示する必要がある場合は、テーブルを完全に再作成する必要があります。
ただし、任意の順序で列を表示するVIEWを作成できます。実際、このテーブルをある種のアプリケーションに使用する場合は、どのような場合でもVIEWを作成する必要があります(適切なアクセスロックを確立できるようにするため)。たとえば、COL_A、COL_B、およびCOL_Cの3つの列を持つMYTABLEという名前のテーブルがあり、それらを逆の順序で「表示」したいとします。
replace view MYDB.MYTABLE_V as
locking MYDB.MYTABLE for access
select COL_C, COL_B, COL_A
from MYDB.MYTABLE
「ビューの置換」を使用すると、ビューがまだ存在しない場合は作成され、存在する場合は置換されます。もちろん、これは、テーブルを変更した場合は、ビューを再作成する必要があることを意味します。安全のために、テーブル作成プログラムのコメントブロックにビュー定義を保持しています。
ビジネス要件により、テーブル定義内の列の順序付けが強制されない限り (たとえば、timestamp がテーブル定義内の最後の列であるなど)、実際には問題になりません。適切な ROW ACCESS ロックを使用して、ビューの列を列 (1:1) にマップする V1 レイヤーがある場合、ビュー定義は常に、列の優先順序位置をエンド ユーザーと BI アプリケーションに公開できます。
列を並べ替える必要がある場合は、次の手順を実行します。
CREATE TABLE MyDB.MyTable_
希望する序数位置、列のデフォルト、値リストの圧縮を指定して送信します。COLLECT STATISTICS ON MyDB.MyTable_ FROM MyDB.MyTable; -- Migrate collected statistics
INSERT INTO MyDB.MyTable_ SELECT /* Columns */ FROM MyDB.MyTable;
RENAME MyDB.MyTable AS MyDB.MyTable1; RENAME TABLE MyDB.MyTable_ AS MyDB.MyTable;
- すべてが正常であることを確認した後、
DROP TABLE MyDB.MyTable1;
ステップ 1 と 3 の代わりに、次のこともできます。
CREATE TABLE MyDB.MyTable_
(/* Column Definitions in new Order */ ) AS
(SELECT /* New Column Ordering */
FROM MyDB.MyTable)
WITH DATA AND STATISTICS
{UNIQUE} PRIMARY INDEX (/* Primary Index Columns */);
このアプローチを使用すると、統計情報が入力される場合とされない場合があります。これは、新しいテーブルが作成された後に確認する必要があります。