既存の列データに影響を与える列データ型の変更を加えるには、次の手順を使用します。
- 変更するデータ型属性を含むテーブルとは異なる名前で、新しいテーブルを作成します。
- INSERT … SELECTリクエストを使用して、新しいテーブルにデータを挿入します。
- ステップ4の前に、古いテーブルの権限をカタログします。次の構文ルールを使用します。
SELECT username, accessright, grantauthority, columnname, allnessflag FROM dbc.allrightsV WHERE tablename = 'table_name' AND databasename = 'database_name';
- 古いテーブルを削除します。
- 新しいテーブルの名前を古いテーブルの名前に変更します。
例えば、name列のデータ型属性を12文字から14文字に拡張するためには、次の一連のリクエストを使用します。
CREATE TABLE temp, FALLBACK ( EmpNo INTEGER NOT NULL FORMAT ZZZZ9, Name CHARACTER(14) NOT NULL, … HCap BYTEINT FORMAT 'Z9') UNIQUE PRIMARY INDEX (index_name) ;
- テーブルを作成後、それに値を挿入し、古いemployeeテーブルを削除し、一時的なテーブル名に変更します。
次の例は、これがどのように行なわれるかを示しています。
INSERT INTO temp SELECT * FROM employee; DROP TABLE employee; RENAME TABLE temp TO employee;
employeeがすでに存在しているので、employeeテーブルの再作成には別の名前(temp)が使用されています。既存のテーブルに対してCREATE TABLEリクエストを実行した場合には、エラーとなります。
ステップ1に従ってテーブルの再作成を簡単に行なうために、SHOW TABLEリクエストを実行して、そのテーブルに対するCREATE TABLE DDLテキストを表示させることができます。
例えば、次のリクエストは、テーブルdept_emに対するCREATE TABLE DDLテキストの再構築を表示します。
SHOW TABLE dept_em;
BTEQを使用する場合には、BTEQの編集コマンドを使用してSQLテキストを変更(つまり、テーブルの名前とインデックスを変更)し、BTEQ SUBMITコマンドを使用して新しいテーブルの定義を実行することができます。
- テーブルが削除されると、権限が失われるので、同じアクセス権をemployeeテーブルに再び与えます。ステップ3でカタログしたものと同じ権限を使用します。
VARCHARまたはVARBYTEの値を増やしても、現在の形式は変わりません。代わりに、リクエストに新しいFORMAT句を含めることを考慮する必要があります。
ALTER TABLEは、ANSI SQLでは提供されない多数の拡張機能を提供します。たとえば、ANSI SQLでの列属性の変更は、デフォルトの句の設定または削除に限定されていますが、Teradata DatabaseのSQLではそうではありません。