バージョンごとのドキュメント一覧

6.2. データの更新 #

<title>Updating Data</title>

The modification of data that is already in the database is referred to as updating. You can update individual rows, all the rows in a table, or a subset of all rows. Each column can be updated separately; the other columns are not affected. 既にデータベースに入っているデータを変更することを「更新(update)する」と言います。 個別の行、テーブル内の全ての行、あるいは全ての行のサブセットを更新できます。 各列は、他の列に影響を及ぼすことなく個別に更新できます。

To update existing rows, use the <xref linkend="sql-update"/> command. This requires three pieces of information: 既存の行の更新を行うにはUPDATEコマンドを使用してください。 その際には3つの情報が必要となります。

  1. <para>The name of the table and column to update</para>

    更新するテーブルと列の名前

  2. <para>The new value of the column</para>

    更新後の列の値

  3. <para>Which row(s) to update</para>

    更新する行

Recall from <xref linkend="ddl"/> that SQL does not, in general, provide a unique identifier for rows. Therefore it is not always possible to directly specify which row to update. Instead, you specify which conditions a row must meet in order to be updated. Only if you have a primary key in the table (independent of whether you declared it or not) can you reliably address individual rows by choosing a condition that matches the primary key. Graphical database access tools rely on this fact to allow you to update rows individually. 第5章で説明した、一般にSQLでは行に対して一意のIDを指定しないことを思い出してください。 従って、どの行を更新するかを直接指定できない場合があります。 その代わりに、更新される行が満たすべき条件を指定します。 テーブルに主キーを設定している場合に限り(ユーザが宣言したのかどうかには関係なく)、主キーと一致する条件を選択することで確実に個別の行を指定できます。 グラフィカルなデータベースアクセスツールは、この方法を使用して行を個別に更新することを可能にしています。

For example, this command updates all products that have a price of 5 to have a price of 10: 例えば、値段が5である全ての商品の値段を10に更新するには、以下のコマンドを使用します。

UPDATE products SET price = 10 WHERE price = 5;

This might cause zero, one, or many rows to be updated. It is not an error to attempt an update that does not match any rows. これによって更新される行の数はゼロであるかもしれませんし、1つ、あるいは多数であるかもしれません。 一致する行がない条件を指定して更新しようとしてもエラーにはなりません。

Let's look at that command in detail. First is the key word <literal>UPDATE</literal> followed by the table name. As usual, the table name can be schema-qualified, otherwise it is looked up in the path. Next is the key word <literal>SET</literal> followed by the column name, an equal sign, and the new column value. The new column value can be any scalar expression, not just a constant. For example, if you want to raise the price of all products by 10% you could use: では、上記のコマンドの詳細を見てみましょう。 最初はUPDATEキーワードで、これにテーブル名が続きます。 いつも通り、テーブル名はスキーマで修飾することもできます。 修飾しない場合はパス内から検索されます。 次にSETキーワードがあり、これに列名、等号、そして更新後の列値が続きます。 更新後の列値は、定数だけでなく任意のスカラ式で表すことができます。 例えば、全ての商品の価格を10%上げるには以下のようにします。

UPDATE products SET price = price * 1.10;

As you see, the expression for the new value can refer to the existing value(s) in the row. We also left out the <literal>WHERE</literal> clause. If it is omitted, it means that all rows in the table are updated. If it is present, only those rows that match the <literal>WHERE</literal> condition are updated. Note that the equals sign in the <literal>SET</literal> clause is an assignment while the one in the <literal>WHERE</literal> clause is a comparison, but this does not create any ambiguity. Of course, the <literal>WHERE</literal> condition does not have to be an equality test. Many other operators are available (see <xref linkend="functions"/>). But the expression needs to evaluate to a Boolean result. このように、新しい値を表す式で行の中の古い値を参照することもできます。 ここでは、WHERE句を省略しました。 WHERE句を省略すると、テーブル内の全ての行が更新されます。 省略しない場合は、WHERE条件に適合する行のみが更新されます。 SET句内の等号が代入を表すのに対し、WHERE句内の等号は比較を表すことに注意してください。 ただし、これによって曖昧さが生じることはありません。 もちろん、必ずしもWHERE条件が等式でなければならないということはありません。 その他にも様々な演算子を使用することができます(第9章を参照)。 ただし、式の評価結果は論理値でなければなりません。

You can update more than one column in an <command>UPDATE</command> command by listing more than one assignment in the <literal>SET</literal> clause. For example: UPDATEコマンドのSET句に複数の代入式を列挙して、複数の列を更新することもできます。 例を示します。

UPDATE mytable SET a = 5, b = 3, c = 1 WHERE a > 0;