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

6.1. データの挿入 #

<title>Inserting Data</title>

When a table is created, it contains no data. The first thing to do before a database can be of much use is to insert data. Data is inserted one row at a time. You can also insert more than one row in a single command, but it is not possible to insert something that is not a complete row. Even if you know only some column values, a complete row must be created. テーブルは、作成時にはデータを含んでいません。 データベースを利用価値のあるものにするには、まずデータを挿入する必要があります。 データは一度に1行ずつ挿入されます。 ユーザは1つのコマンドで複数行を挿入することもできますが、完全な行でないものを挿入することはできません。 列の値が一部しかわかっていない場合でも、1行全体を作成しなければなりません。

To create a new row, use the <xref linkend="sql-insert"/> command. The command requires the table name and column values. For example, consider the products table from <xref linkend="ddl"/>: 新規の行を作成するには、INSERTコマンドを使用します。このコマンドは、テーブル名と列の値を必要とします。 例えば、第5章のproductsテーブルの例で考えてみましょう。

CREATE TABLE products (
    product_no integer,
    name text,
    price numeric
);

An example command to insert a row would be: 行を挿入するためのコマンド例は以下のようになります。

INSERT INTO products VALUES (1, 'Cheese', 9.99);

The data values are listed in the order in which the columns appear in the table, separated by commas. Usually, the data values will be literals (constants), but scalar expressions are also allowed. データ値は、テーブル内で列が存在する順序に従ってカンマで区切って列挙されています。 通常、データ値はリテラル(定数)ですが、スカラ式も使用できます。

The above syntax has the drawback that you need to know the order of the columns in the table. To avoid this you can also list the columns explicitly. For example, both of the following commands have the same effect as the one above: 上記の構文には、テーブル内の列の順序を知っていなければならないという欠点があります。 これを避けるには、列を明示的に列挙する方法があります。 例えば、以下の2つのどちらのコマンドでも上記のコマンドと同等の効果が得られます。

INSERT INTO products (product_no, name, price) VALUES (1, 'Cheese', 9.99);
INSERT INTO products (name, price, product_no) VALUES ('Cheese', 9.99, 1);

Many users consider it good practice to always list the column names. 多くのユーザは常に列名を列挙する方法が優れていると考えています。

If you don't have values for all the columns, you can omit some of them. In that case, the columns will be filled with their default values. For example: 値がわからない列については、省略することができます。 省略した列には、デフォルト値が挿入されます。 以下に例を示します。

INSERT INTO products (product_no, name) VALUES (1, 'Cheese');
INSERT INTO products VALUES (1, 'Cheese');

The second form is a <productname>PostgreSQL</productname> extension. It fills the columns from the left with as many values as are given, and the rest will be defaulted. 後者はPostgreSQLの拡張機能です。 これによって、列には左から順に指定されただけの値が挿入され、残りにはデフォルト値が挿入されます。

For clarity, you can also request default values explicitly, for individual columns or for the entire row: 明確にするため、列ごと、あるいは行全体についてデフォルト値を明示的に要求することもできます。

INSERT INTO products (product_no, name, price) VALUES (1, 'Cheese', DEFAULT);
INSERT INTO products DEFAULT VALUES;

You can insert multiple rows in a single command: 単一コマンドで複数行を挿入することができます。

INSERT INTO products (product_no, name, price) VALUES
    (1, 'Cheese', 9.99),
    (2, 'Bread', 1.99),
    (3, 'Milk', 2.99);

It is also possible to insert the result of a query (which might be no rows, one row, or many rows): また、問い合わせの結果(0行か、1行か、複数行かもしれない)を挿入することもできます。

INSERT INTO products (product_no, name, price)
  SELECT product_no, name, price FROM new_products
    WHERE release_date = 'today';

This provides the full power of the SQL query mechanism (<xref linkend="queries"/>) for computing the rows to be inserted. これにより、挿入する行を計算するためにSQLの問い合わせ機構(第7章)の全機能が提供されます。

ヒント

When inserting a lot of data at the same time, consider using the <xref linkend="sql-copy"/> command. It is not as flexible as the <xref linkend="sql-insert"/> command, but is more efficient. Refer to <xref linkend="populate"/> for more information on improving bulk loading performance. 一度に大量のデータを挿入する場合はCOPYコマンドの使用を検討してください。 INSERTコマンドほどの柔軟性はありませんが、より効率的です。 大量のデータをロードする性能を向上することについて、詳細は14.4を参照してください。