FrontPage


Firebird SQL リファレンス:INSERT/UPDATE/DELETE



INSERT

 指定したテーブルに、新しいいくつかの行を追加します。 SQL,DSQLおよびisqlから使用出来ます。
 この文書は、公開されているIB6のSQLレファレンスを基とし、1.5.1までの 各リリースノートにおける追加内容に関して反映・統合されています。

構文


INSERT [TRANSACTION transaction] INTO <object> [(col [, col …])]
       {VALUES (<val> [, <val> …]) | <select_expr>};
<object> = tablename | viewname
<val> = {:variable | <constant> | <expr>
    | <function> | udf ([<val> [, <val> …]])
    | NULL | USER | RDB$DB_KEY | ?
    } [COLLATE collation]
<constant> = num | 'string' | charsetname 'string'
<function> = CAST (<val> AS <datatype>)
    | UPPER (<val>)
    | GEN_ID (generator, <val>)
引数説明
expr1つの値が得られるSQL式
select_expr挿入する列数と同じ数の列データが得られる、0行以上の取得結果が得られるSELECT

詳細の説明

 指定したテーブルまたビューに、新しいいくつかの行を追加します。列に入力する 値のソースとしては、定数(含む文字列)以外にも、式、UDF、任意のSELECT文による クエリ結果などが指定可能です。 埋め込みSQL等の場合には、変数名も使用できます。

  • プレースホルダ(例:"?")は、SQL及びisqlでは使用できません。
  • DSQLとisqlでは、valに変数(:variable)は使用できません。
  • BLOBの列に COLLATE を指定することは出来ません。
  • DSQLの場合は行終端文字のセミコロンを指定してはなりません。 isql及びC/C++の埋め込みSQLでは行の終わりを示すために終端文字は必要です。
  • 節の詳細の説明です。
    引数説明
    TRANSACTION transaction指定した名前のトランザクション下でINSERTが実行されます。
    DSQL,isqlでは使用できません。
    INTO objectデータをインサートする、有効なテーブルまたはビューを指定します。
    col値をインサートする、有効なテーブルまたはビューのの列名を指定します。
    VALUES (val [, val …])テーブルまたはビューにインサートするデータのリスト。並び順はターゲットの列と同じ順番である必要がある
    select_exprターゲットの列に挿入するデータを得るためのクエリ

     INSERTは、1つ以上の新しい行データをテーブルまたはビューに追加します。 INSERTは、GRANTおよびREVOKE文により制御されるデーターベースに対する特権の 一つです。

     (省略可能な)ターゲットとなる列のリストが示された場合、指定された値はリスト での列指定順に指定されているものとみなされます。指定がない列には、自動的に デフォルト値またはnullが設定されます。

     ターゲットとなる列のリストが示されない(省略された)場合には、VALUE節には すべての列分の設定する値を記述しなければなりません。

     1つの行をインサートする場合、通常はVALUESに値を指定して行います。

     複数行のデータを一度にインサートする場合、別のテーブルからデータを取り出す select_expr指定を使います。ここで選択される列は、インサートするターゲット となる列の指定と一致しなければなりません。
     重要 同じテーブルからインサートすることも可能ですが、無限ループに陥る 可能性があるので、お勧めしません。

     TRANSACTION節は、多重トランザクションSQLアプリケーションにおいて、どの トランザクションがINSERTを実行するかを制御するためにあります。これはDSQLや isqlでは使用できません。

用例

  • 単純な行の追加
    INSERT INTO EMPLOYEE_PROJECT (EMP_NO, PROJ_ID)
      VALUES (100, 'Simple');
  • 埋め込みSQLの例:割当てられた2つの変数の内容の行を追加します。
    EXEC SQL
    
    INSERT INTO EMPLOYEE_PROJECT (EMP_NO, PROJ_ID)
      VALUES (:emp_no, :proj_id);


  • isqlの例:SELECTにより指定された行の挿入
    INSERT INTO PROJECTS
      SELECT * FROM NEW_PROJECTS
        WHERE NEW_PROJECTS.START_DATE > '6-JUN-1994';


参照

GRANT , REVOKE , SET TRANSACTION , UPDATE






UPDATE

 テーブル、ビュー、アクティブなカーソルに対して、行のすべてまたは一部の 列データ値を変更します。 SQL,DSQLおよびisqlから使用出来ます。
 この文書は、公開されているIB6のSQLレファレンスを基とし、1.5.1までの 各リリースノートにおける追加内容に関して反映・統合されています。

構文


SQL での構文:

UPDATE [TRANSACTION transaction] {table | view}
SET col = <val> [, col = <val> …]
[WHERE <search_condition> | WHERE CURRENT OF cursor];


DSQL,isql での構文:

UPDATE {table | view}
SET col = <val> [, col = <val> …]
[WHERE <search_condition>]


<val> = {
        col [<array_dim>]
        | :variable
        | <constant>
        | <expr>
        | <function>
        | udf ([<val> [, <val> …]])
        | NULL
        | USER
        | ?
    }
    [COLLATE collation]
<array_dim> = [[x:]y [, [x:]y …]]
<constant> = num | 'string' | charsetname 'string'
<function> = CAST (<val> AS <datatype>)
    | UPPER (<val>)
    | GEN_ID (generator, <val>)
<expr> = 1つの値を返すSQL式
<search_condition> = CREATE TABLE を参照してください

詳細の説明

 指定したテーブル、ビュー、アクティブなカーソルに対して、行のすべてまたは 一部の列値を更新します。値のソースとしては、定数(含む文字列)以外にも、式、 UDF、SQL式よるクエリ結果などが指定可能です。 埋め込みSQL等の場合には、変数名も使用できます。

  • プレースホルダ(例:"?")は、SQL及びisqlでは使用できません。
  • DSQLとisqlでは、valに変数(:variable)は使用できません。
  • BLOBの列に COLLATE を指定することは出来ません。
  • DSQLの場合は行終端文字のセミコロンを指定してはなりません。 isql及びC/C++の埋め込みSQLでは行の終わりを示すために終端文字は必要です。
  • 節の詳細の説明です。
    引数説明
    TRANSACTION transaction指定した名前のトランザクション下でUPDATEが実行されます。
    DSQL,isqlでは使用できません。
    table|view更新対象の名前がテーブルかビューかを指定します。
    SET col = val指定列のに設定する値を指定します。
    WHERE search_condition検索更新時に指定します。更新対象になる行を検索する条件を指定します。
    WHERE CURRENT OF cursor位置指定更新時に指定します。更新対象になる行を特定するカーソルを指定します。
    ?プレースホルダ。DSQLおよびisqlでは使用できません

     UPDATEは、テーブルまたはビューの1つ以上の行データ更新します。 UPDATEは、GRANTおよびREVOKE文により制御されるデーターベースに対する特権の 一つです。

     WHERE を使用することにより、指定条件に合致した行のみを変更することが出来 ます。ただし、これは配列の一部要素に対しては使用できません。

     重要 WHERE節が省略された場合、すべての列に対して指定した更新が行われ ます。

     WHERE CURRENT OF節によるカーソルによる位置指定更新の場合、1回の実行で1行 の更新が行われます。

    ※ BLOB列を更新する場合、UPDATEはすべてのBLOBを新しい値に置き換えます。

用例

  • すべての行の指定列を変更します。
    UPDATE CITIES
      SET POPULATION = POPULATION * 1.03;

  • 指定された条件の行を変更します。
    UPDATE TESTTABLES
      SET STATUS = 20, FLAG=0
      WHERE FLAG = 1;

  • 埋め込みSQLの例:WHEREでの条件指定の例ですが、条件値と設定値を変数で与えて います。
    EXEC SQL
    UPDATE PROJECT
      SET PROJ_DESC = :blob_id
      WHERE PROJ_ID = :proj_id;

参照

DELETE , GRANT , INSERT , REVOKE , SELECT






DELETE

 テーブル、アクティブなカーソルの行を削除します。 SQL,DSQLおよびisqlから使用出来ます。
 この文書は、公開されているIB6のSQLレファレンスを基とし、1.5.1までの 各リリースノートにおける追加内容に関して反映・統合されています。

構文


SQLおよびDSQLでの構文:
※DSQLの場合、セミコロンは不要です。

DELETE [TRANSACTION transaction] FROM table
    {[WHERE <search_condition>] | WHERE CURRENT OF cursor};

isqlでの構文:

DELETE FROM TABLE [WHERE <search_condition>];


<search_condition> = [[SELECT]]を参照して下さい。
引数説明
TRANSACTION transaction指定した名前のトランザクション下で実行されます。
DSQL,isqlでは使用できません。
table行を削除するテーブルの名前です。
WHERE search_condition削除する行を検索する条件を指定します。この節を省略すると、すべての行に対して処理が行われます。
WHERE CURRENT OF cursor削除対象になる行を特定するカーソルを指定します。

詳細の説明

 DELETEは、テーブルまたはビューの1つ以上の行を削除します。 DELETEは、GRANTおよびREVOKE文により制御されるデーターベースに対する特権の 一つです。

 TRANSACTION節は、多重トランザクションSQLアプリケーションにおいて、どの トランザクションがDELETEを実行するかを制御するためにあります。これはDSQLや isqlでは使用できません。

 WHERE を使用することにより、指定条件に合致した行のみを削除することが出来 ます。

 重要 WHERE節が省略された場合、テーブルの全列が削除されます。

 WHERE CURRENT OF節によるカーソルによる位置指定削除の場合、1回の実行で1行 の削除が行われます。

用例

  • テーブルのすべての行を削除します。
    DELETE FROM EMPLOYEE_PROJECT;

  • 指定された条件に合致する行を削除します。
    DELETE FROM TESTTABLES WHERE ID = 0 OR FLAG = 2;

  • 埋め込みSQLの例:ホスト言語の変数で指定した条件に合致する行を削除します。
    EXEC SQL
    DELETE FROM SALARY_HISTORY
      WHERE EMP_NO = :emp_num;

  • 埋め込みSQLの例:ホスト変数:min_popよりもPOPULATIONが小さい行を検索する カーソルを作成し、そのカーソルにより削除を行います。FETCHにより1行ずつ 取り込み、その行を削除しています。
    EXEC SQL
    DECLARE SMALL_CITIES CURSOR FOR
    SELECT CITY, STATE
    FROM CITIES
    WHERE POPULATION < :min_pop;
    
    EXEC SQL
    OPEN SMALL_CITIES;
    
    EXEC SQL
    FETCH SMALL_CITIES INTO :cityname, :statecode;
    
    WHILE (!SQLCODE)
    {
      EXEC SQL
      DELETE FROM CITIES
      WHERE CURRENT OF SMALL_CITIES;
    
      EXEC SQL
      FETCH SMALL_CITIES INTO :cityname, :statecode;
    }
    
    EXEC SQL
    CLOSE SMALL_CITIES;

参照

DECLARE CURSOR , FETCH , GRANT , OPEN , REVOKE , SELECT