Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » SQL Anywhere サーバ - SQL リファレンス » SQL の使用 » SQL 文 » SQL 文 (E ~ O)

 

INSERT 文

1 つのロー (構文 1) またはデータベースのある場所から選択したロー (構文 2) をテーブルに挿入します。

構文 1
INSERT [ INTO ] [ owner.]table-name [ ( column-name, ... ) ]
[ ON EXISTING { 
   ERROR 
   | SKIP 
   | UPDATE [ DEFAULTS { ON | OFF } ] 
   } ]
{ DEFAULT VALUES 
   | VALUES ( [ expression | DEFAULT, ...) ] }
[ OPTION( query-hint, ... ) ]
構文 2
INSERT [ INTO ] [ owner.]table-name [ ( column-name, ... ) ]
[ ON EXISTING { 
   ERROR 
   | SKIP 
   | UPDATE [ DEFAULTS { ON | OFF } ] 
   } ]
[ WITH AUTO NAME ]
select-statement
[ OPTION( query-hint, ... ) ]
query-hint :
MATERIALIZED VIEW OPTIMIZATION option-value
| FORCE OPTIMIZATION
| FORCE NO OPTIMIZATION
| option-name = option-value
option-name : identifier
option-value : hostvar (許容されたインジケータ), string, identifier, または number
パラメータ
  • VALUES 句   VALUES 句は、挿入する値を指定するときに使用します。対象となるカラムに定義されているデフォルト値を挿入する場合は、DEFAULT VALUES を指定します。VALUES () と指定しても DEFAULT VALUES と同義になります。

  • WITH AUTO NAME 句   WITH AUTO NAME は、構文 2 だけに適用されます。WITH AUTO NAME を指定すると、SELECT 文の項目名によってデータの所属カラムが決まります。SELECT 文の項目には、カラム参照かエイリアスの式を指定してください。SELECT 文で定義されていない送信先カラムには、デフォルト値が割り当てられます。これは送信先テーブルのカラム数が多い場合に役立ちます。

  • ON EXISTING 句   INSERT 文の ON EXISTING 句は、両方の構文に適用されます。ON EXISTING 句は、プライマリ・キー・ルックアップに基づいて、新しいカラム値でテーブルの既存のローを更新します。この句は、プライマリ・キーが設定されたテーブルでのみ使用できます。プライマリ・キーがないテーブルでこの句を使用すると、構文エラーになります。ON EXISTING を指定してプロキシ・テーブルに値を挿入することはできません。

    注意

    ON EXISTING 条件を満たすローが数多く存在する可能性がある場合は、代わりに MERGE 文を使用してください。MERGE 文を使用すると、一致するローに対して実行するアクションをより詳細に制御できます。また、一致を定義するためのより高度な構文も使用できます。MERGE 文を参照してください。

    ON EXISTING 句を指定すると、データベース・サーバは各入力ローに対してプライマリ・キー・ルックアップを実行します。対応するローがテーブルに存在しなければ、新しいローを挿入します。ローがテーブルにすでに存在する場合は、入力ローを無視する (SKIP)、重複したキー値のエラー・メッセージを生成する (ERROR)、入力ローの値を使用して古い値を更新する (UPDATE) 操作のいずれかを選択できます。ON EXISTING 句を指定しなかった場合は、デフォルトでは、ローがすでに存在するテーブルにローを挿入しようとすると、キー値の重複エラーになります。また、ON EXISTING ERROR 句を指定するときと同じです。

    ON EXISTING UPDATE を使用している場合、入力したローは格納されているローと比較されます。入力ローに指定されているすべてのカラム値は、格納されているローの対応するカラム値を置換します。同様に、入力ローに明示的にカラム値が指定されていない場合、格納されているローの対応するカラム値は変化しません。ただし、デフォルト値があるカラムの場合は例外です。また、デフォルト値があるカラム (DEFAULT AUTOINCREMENT カラムなど) を含む ON EXISTING UPDATE 句を使用する場合、ON EXISTING UPDATE DEFAULTS ON を指定することでデフォルト値でカラム値を更新するか、ON EXISTING UPDATE DEFAULTS OFF を指定してカラム値をそのままにすることができます。何も指定しない場合、デフォルトの動作は ON EXISTING UPDATE DEFAULTS OFF です。

    注意

    DEFAULTS ON パラメータと DEFAULTS OFF パラメータは、DEFAULT TIMESTAMP、DEFAULT UTC TIMESTAMP、または DEFAULT LAST USER の値に関係ありません。これらのカラムでは、格納されているローの値は UPDATE 中に常に更新されます。

    ON EXISTING SKIP 句と ON EXISTING ERROR 句を使用するときにテーブルにデフォルトのカラムが含まれていると、サーバは、すでに存在するローに対しても、デフォルト値を計算します。結果として、AUTOINCREMENT のようなデフォルト値が、スキップされたローに対しても影響を及ぼします。AUTOINCREMENT の場合は、AUTOINCREMENT のシーケンスで値がスキップされます。次の例で説明します。
    CREATE TABLE t1( c1 INT PRIMARY KEY, c2 INT DEFAULT AUTOINCREMENT );
    INSERT INTO t1( c1 ) ON EXISTING SKIP VALUES( 20 );
    INSERT INTO t1( c1 ) ON EXISTING SKIP VALUES( 20 );
    INSERT INTO t1( c1 ) ON EXISTING SKIP VALUES( 30 );

    最初の INSERT 文に定義されたローが挿入され、c2 は 1 に設定されます。2 番目の INSERT 文に定義されたローは、既存のローに一致するため、スキップされます。ただし、オートインクリメント・カウンタは 2 に増分されたまま残ります (既存のローには影響ありません)。3 番目の INSERT 文に定義されたローが挿入され、c2 の値は 3 に設定されます。したがって、上記の例で挿入された値は次のようになります。

    20,1
    30,3
    警告

    SQL Remote を使用している場合、DEFAULT LAST USER カラムをレプリケートしないでください。カラムをレプリケートすると、カラム値はレプリケートされた値ではなく、SQL Remote ユーザに設定されます。

  • OPTION 句   この句は、文を実行するためのヒントを指定するときに使用します。次のヒントがサポートされます。

    • MATERIALIZED VIEW OPTIMIZATION option-value
    • FORCE OPTIMIZATION
    • FORCE NO OPTIMIZATION
    • option-name = option-value

    これらのオプションの詳細については、SELECT 文の OPTIONS 句の説明を参照してください。

備考

INSERT 文を使って、データベース・テーブルに新しいローを追加します。

テキスト・インデックスとマテリアライズド・ビューは基本となるテーブル・データの変更によって影響を受けるため、基本となるテーブルにデータをバルク・ロード (LOAD TABLE、INSERT、MERGE) する前に、従属するテキスト・インデックスまたはマテリアライズド・ビューをトランケートすることを検討してください。TRUNCATE 文TRUNCATE TEXT INDEX 文を参照してください。

構文 1   指定された式のカラム値を使用して、1 つのローを挿入します。キーワード DEFAULT を使うと、カラムのデフォルト値を挿入できます。オプションのカラム名のリストを指定すると、指定したカラムの中に値が 1 つずつ挿入されます。カラム名のリストを指定しないと、作成順 (SELECT * を使って取り出すときと同じ順序) に値がテーブル・カラムの中に挿入されます。ローは、テーブル内の任意の位置に挿入されます。リレーショナル・データベースでは、テーブルの順序は指定されません。

構文 2   一般的な SELECT 文の結果を使用して、テーブルに大量に挿入します。SELECT 文に ORDER BY 句が含まれていない場合、任意の順序で挿入が行われます。SELECT 文を参照してください。

カラム名を指定すると、select リストのカラムは、通常、カラム・リストに指定されたカラム、または作成順に並べたカラムと一致します。

ビューを定義しているクエリ指定が更新可能な場合は、ビューに対して挿入操作を実行できます。派生の関係で更新不可能なビューの識別については、通常のビューの操作を参照してください。

テーブルに挿入した文字列は、データベースが大文字と小文字を区別するかどうかに関係なく、常に入力された大文字と小文字の状態のままで格納されます。そのため、テーブルに挿入される文字列 Value は、常に V が大文字、残りの文字が小文字でデータベースに格納されます。SELECT 文は、文字列を Value として返します。ただし、データベースで大文字と小文字が区別されない場合は、すべての比較において Value は value、VALUE などと同じと見なされます。さらに、単一カラムのプライマリ・キーにエントリ Value がある場合は、プライマリ・キーがユニークでなくなるので、INSERT 文による value の追加は拒否されます。

INSERT 文を使用してデータを大量に挿入する場合も、カラム統計は更新されます。

パフォーマンスに関するヒント

テーブルに多数のローを挿入するには、個別の INSERT 文を多数実行するよりも、可能であればカーソルを宣言し、そのカーソルを通じてローを挿入する方が効率的です。データを挿入する前に、テーブル・ページごとに今後の更新のために確保する空き領域の割合を指定できます。ALTER TABLE 文を参照してください。

パーミッション

テーブルに対する INSERT パーミッションが必要です。

ON EXISTING UPDATE 句が指定された場合、テーブルの UPDATE パーミッションも必要になります。

関連する動作

なし

参照
標準と互換性
  • SQL/2003   コア機能。INSERT ... ON EXISTING はベンダ拡張です。

データベースに Eastern Sales 部を追加します。

INSERT
INTO Departments ( DepartmentID, DepartmentName )
VALUES ( 230, 'Eastern Sales' );

テーブル DepartmentHead を作成し、WITH AUTO NAME 構文を使用して部長とその部の名前を挿入します。

CREATE TABLE DepartmentHead(
      pk INT PRIMARY KEY DEFAULT AUTOINCREMENT,
      DepartmentName VARCHAR(128),
      ManagerName VARCHAR(128) );
INSERT
INTO DepartmentHead WITH AUTO NAME
SELECT GivenName || ' ' || Surname AS ManagerName,
      DepartmentName
FROM Employees JOIN Departments
ON EmployeeID = DepartmentHeadID;

テーブル MyTable5 を作成し、WITH AUTO NAME 構文を使用してデータを移植します。

CREATE TABLE MyTable5(
      pk INT PRIMARY KEY DEFAULT AUTOINCREMENT,
      TableName CHAR(128),
      TableNameLen INT );
INSERT INTO MyTable5 WITH AUTO NAME
SELECT
      length(t.table_name) AS TableNameLen,
      t.table_name AS TableName
FROM SYS.SYSTAB t
WHERE table_id <= 10;

データベースの現在の独立性レベル設定ではなく、独立性レベル 3 で文を実行し、新しい部署を挿入します。

INSERT INTO Departments
   (DepartmentID, DepartmentName, DepartmentHeadID)
   VALUES(600, 'Foreign Sales', 129)
   OPTION( isolation_level = 3 );