Skip to main content

CREATE TABLE AS SELECT (SQL)

列定義と列データを既存のテーブルから新しいテーブルへコピーします。

構文

CREATE TABLE table-name AS query [shard-key] [WITH table-option]

引数

table-name 作成するテーブルの名前。有効な識別子を指定します。テーブル名は修飾 (schema.table)、未修飾 (table) のどちらでもかまいません。テーブル名が未修飾の場合は、既定のスキーマ名が使用されます。
query 新しいテーブルに列定義と列データを提供する SELECT クエリ。このクエリは、テーブル、ビュー、または複数の結合テーブルを指定できます。ただし、通常の SELECT 文のような ? パラメータは指定できません。
shard-key オプションシャード・キー定義。SHARD キーワード単独で構成するか、後にシャード・キー定義構文が続きます。
WITH table-option オプション — 1 つ以上のテーブル・オプション (例えば、%CLASSPARAMETER キーワードと、それに続く名前および関連するリテラル) のコンマ区切りリスト。

説明

CREATE TABLE AS SELECT コマンドは、SELECT クエリで指定したように、既存のテーブルの列定義と列データをコピーすることにより、新しいテーブルを作成します。SELECT クエリでは、テーブルまたはビューの任意の組み合わせを指定できます。

Note:

CREATE TABLE AS SELECT では、既存のテーブル定義からコピーします。新しいテーブル定義を指定するには、CREATE TABLE コマンドを使用します。

テーブルのコピー操作は、QueryToTable()Opens in a new tab メソッド呼び出しを使用して呼び出すこともできます。

DO $SYSTEM.SQL.Schema.QueryToTable(query,table-name,0)

データ定義のコピー

  • CREATE TABLE AS SELECT は、query テーブルから列定義をコピーします。コピーした列の名前を変更するには、query列エイリアスを指定します。

    query で結合テーブルを指定する場合、CREATE TABLE AS SELECT は複数のテーブルから列定義をコピーできます。

  • CREATE TABLE AS SELECT は、常に RowID を非公開として定義します。

    • ソース・テーブルに非公開の RowID がある場合、CREATE TABLE AS SELECT はソース・テーブルの RowID をコピーしませんが、作成したテーブルに新しい RowID 列を作成します。コピーされた行には、新しい一連の RowID 値が割り当てられます。

    • ソース・テーブルに公開された (非表示ではない) RowID がある場合、またはクエリで明示的に非公開の RowID を選択している場合、CREATE TABLE AS SELECT はこのテーブルに新しい RowID 列を作成します。ソース・テーブルの RowID は、非公開でも、一意でも、必須でもない通常の BigInt フィールドとして新しいテーブルにコピーされます。ソース・テーブルの RowID を "ID" と名付けた場合、新しいテーブルの RowID の名前は "ID1" となります。

  • ソース・テーブルに IDENTITY フィールドがある場合、CREATE TABLE AS SELECT はこのフィールドとその現在のデータを、ゼロでない正の整数の、一意でも必須でもない通常の BIGINT フィールドとしてコピーします。

  • CREATE TABLE AS SELECT は、IDKEY インデックスを定義します。これはコピーされた列定義に関連付けられたインデックスをコピーしません。

  • CREATE TABLE AS SELECT は、列の制約をコピーしません。これはコピーされた列定義に関連付けられた NULL/NOT NULL、UNIQUE、主キー、または外部キーの制約をコピーしません。

  • CREATE TABLE AS SELECT は、既定の制約またはコピーされた列定義に関連付けられた値をコピーしません。

  • CREATE TABLE AS SELECT は、コピーされた列定義に関連付けられた COMPUTECODE データ制約をコピーしません。

  • CREATE TABLE AS SELECT は、コピーされたテーブルまたは列定義に関連付けられた %DESCRIPTION 文字列をコピーしません。

特権

CREATE TABLE AS SELECT コマンドは特権を必要とする操作です。CREATE TABLE AS SELECT を実行するには、ユーザは %CREATE_TABLE 管理特権を持っている必要があります。持っていない場合、SQLCODE –99 エラーが発生し、%msg が "ユーザ 'name' は %CREATE_TABLE 特権を持っていません" に設定されます。適切な付与特権を持っていれば、GRANT コマンドを使用して、ユーザまたはロールに %CREATE_TABLE 特権を割り当てることができます。管理特権はネームスペース固有のものです。詳細は、"特権" を参照してください。

ユーザは、query で指定されたテーブルに対する SELECT 特権を持っている必要があります。

テーブル名

テーブル名は修飾、未修飾のどちらでもかまいません。

  • 未修飾のテーブル名には、tablename という構文を使用します。schema (およびピリオド (.) 文字) は省略します。テーブル名が未修飾の場合は、既定のスキーマ名が使用されます。初期のシステム全体の既定のスキーマ名は、既定のクラス・パッケージ名 User に対応する SQLUser です。スキーマ検索パスの値は無視されます。

    既定のスキーマ名は構成可能です

    現在のシステム全体の既定のスキーマ名を確認するには、$SYSTEM.SQL.Schema.Default()Opens in a new tab メソッドを使用します。

  • テーブル名を修飾する場合は、schema.tablename という構文を使用します。既存のスキーマ名を指定することも、新規スキーマ名を指定することもできます。既存のスキーマ名を指定すると、テーブルはスキーマ内に配置されます。新規スキーマ名を指定すると、その名前のスキーマ (および関連するクラス・パッケージ) が作成され、テーブルがそのスキーマ内に配置されます。

テーブル名とスキーマ名は、SQL 識別子の名前付け規約と、非英数文字の使用、一意性、および最大長に関する追加の制約に従います。% 文字で始まる名前は、システムによる使用のために予約されています。既定では、スキーマ名とテーブル名は単純な識別子であり、大文字と小文字が区別されません。

InterSystems IRIS はテーブル名を使用して、対応するクラス名を生成します。InterSystems IRIS はスキーマ名を使用して、対応するクラス・パッケージ名を生成します。クラス名には英数字 (文字および数字) のみを使用し、最初の 96 文字は一意である必要があります。クラス名を生成するために、InterSystems IRIS はまず記号 (非英数字) 文字をテーブル名から削除し、一意性と最大長の制約を課して一意のクラス名を生成します。パッケージ名を生成するために、InterSystems IRIS はスキーマ名内の記号 (非英数字) 文字に対して削除または特殊処理のいずれかを実行します。次に InterSystems IRIS は、一意性と最大長の制約を課して一意のパッケージ名を生成します。スキーマ名とテーブル名からパッケージ名とクラス名を生成する方法の詳細は、"テーブル名とスキーマ名" を参照してください。

スキーマとテーブルに同じ名前を使用することはできません。同じスキーマ内でテーブルとビューに同じ名前を使用することはできません。

スキーマ名では大文字と小文字が区別されず、対応するクラス・パッケージ名では大文字と小文字が区別されます。指定したスキーマ名が、既存のクラス・パッケージ名と大文字/小文字のみが異なり、パッケージ定義が空の (クラス定義が含まれていない) 場合、InterSystems IRIS では、クラス・パッケージ名の大文字/小文字を変更して 2 つの名前が照合されます。スキーマ名の詳細は、"テーブル名とスキーマ名" を参照してください。

InterSystems IRIS は 16 ビット (ワイド) 文字のテーブル名と列名をサポートします。大部分のロケールで、テーブル名にはアクセント記号付き文字を使用でき、生成されるクラス名にもアクセント記号が含まれます。以下の例は、SQL テーブル名の検証テストを実行します。

TableNameValidation
  SET tname="MyTestTableName"
  SET x=$SYSTEM.SQL.IsValidRegularIdentifier(tname)
  IF x=0 {IF $LENGTH(tname)>200  
             {WRITE "Tablename is too long" QUIT}
          ELSEIF $SYSTEM.SQL.IsReservedWord(tname) 
             {WRITE "Tablename is reserved word" QUIT}
          ELSE {
            WRITE "Tablename contains invalid characters",!
            SET nls=##class(%SYS.NLS.Locale).%New()
            IF nls.Language [ "Japanese" {
            WRITE "Japanese locale cannot use accented letters"
            QUIT }
         QUIT }
   }
   ELSE { WRITE tname," is a valid table name"}
Note:

日本のロケールでは、アクセント記号付きの文字を識別子でサポートしていません。日本語の識別子には、日本語の文字に加え、ラテン文字の A ~ Z と a ~ z (65 ~ 90 および 97 ~ 122)、アンダースコア文字 (95)、とギリシャ文字の大文字 (913 ~ 929 および 931 ~ 937) を使用できます。nls.Language テストでは、= ではなく [ (包括関係演算子) を使用しています。オペレーティング・システム・プラットフォームごとに日本語ロケールが異なるためです。

既存のテーブル

テーブルが現在のネームスペースに既に存在するかどうかを確認するには、$SYSTEM.SQL.Schema.TableExists("schema.tname")Opens in a new tab を使用します。

既定では、既存のテーブルと同じ名前のインテーブルを作成しようとすると、InterSystems IRIS はテーブルの作成試行を拒否し、SQLCODE -201 エラーを発行します。現在のシステム全体の設定を確認するには、$SYSTEM.SQL.CurrentSettings()Opens in a new tab を呼び出します。これにより、[既存テーブルに対して DDL CREATE TABLE または CREATE VIEW を許可] 設定が表示されます。既定値は 0 で、この設定を推奨します。このオプションを 1 に設定すると、InterSystems IRIS はこのテーブルに対応するクラス定義を削除し、クラスを再作成します。つまり、DROP TABLE を実行して既存のテーブルを削除し、CREATE TABLE を実行する動作と同じ結果を生じます。この場合、$SYSTEM.SQL.CurrentSettings()Opens in a new tab[DDL DROP TABLEがテーブルのデータを削除する] の値を 1 (既定) に設定することを強くお勧めします。詳細は、"DROP TABLE" を参照してください。

管理ポータル、[システム管理][構成][SQL とオブジェクトの設定][SQL] から [冗長な DDL ステートメントを無視] チェック・ボックスにチェックを付けることにより、このオプション (および他の同様の作成、変更、および削除のオプション) をシステム全体で設定できます。

WITH テーブル・オプション

オプションの WITH 節は、SELECT 節の後に指定できます。WITH 節には、%CLASSPARAMETER 節のコンマ区切りリストを含めることができます。

%CLASSPARAMETER キーワードを使用すると、クラス・パラメータを CREATE TABLE AS SELECT コマンドの一部として定義できます。クラス・パラメータは必ず定数値として定義します。%CLASSPARAMETER キーワードの後には、そのクラス・パラメータに割り当てるクラス・パラメータ名、オプションの等号、およびリテラル値 (文字列または数値) を指定します。

複数の %CLASSPARAMETER キーワード節を指定できます。1 つの節につき 1 つのクラス・パラメータを定義します。複数の CLASSPARAMETER 句はコンマで区切ります。

例えば、既定で CREATE TABLE AS SELECT はグローバル名が生成されている作成済みのテーブルの IDKEY インデックス (^EPgS.D8T6.1 など) を作成します。追加のインデックスは、一意の整数の接尾語を付けた同じグローバル名を使用します。以下の例は、IDKEY インデックスの明示的なグローバル名と将来的に追加されるインデックスの指定方法を示します。

CREATE TABLE Sample.YoungPeople
AS SELECT Name,Age
FROM Sample.People
WHERE Age<21
WITH %CLASSPARAMETER DEFAULTGLOBAL = '^GL.UNDERTWENTYONE'

詳細は、CREATE TABLE のリファレンス・ページの "WITH 節と %CLASSPARAMETER キーワード" を参照してください。

関連項目

FeedbackOpens in a new tab