前章では、データを保持するためのテーブルやその他の構造の作成方法について説明しました。 いよいよ、テーブルにデータを挿入してみましょう。 本章では、テーブルのデータの挿入、更新、削除の方法について説明します。 また、特定のイベントが起こったときに自動的にデータを変更する方法、すなわちトリガと書き換えルールについても紹介します。 そして本章以降において、ずっと見つけられなかったデータをデータベースから抽出する方法について説明します。
テーブルは、作成時にはデータを含んでいません。 データベースを利用価値のあるものにするには、まずデータを挿入する必要があります。 理論的には、データは1度に1行ずつ挿入されます。 もちろんユーザは複数行に挿入することもできますが、1度に1行未満を挿入することはできません。 列の値が一部しか分かっていない場合でも、1行全体を作成しなければなりません。
新規の行を作成するには、INSERTコマンドを使用します。 このコマンドでは、テーブル名とテーブルの各列の値を指定する必要があります。 たとえば、第5章のproductsテーブルの例で考えてみましょう。
CREATE TABLE products ( product_no integer, name text, price numeric );
この場合、行を挿入するためのコマンドは以下のようになります。
INSERT INTO products VALUES (1, 'Cheese', 9.99);
データ値は、テーブルで列が表示される順序に従ってカンマで区切って列挙します。 通常、データ値はリテラル(定数)ですが、スカラ式も使用できます。
上記の構文には、テーブル内の列の順序を知っていなければならないという難点があります。 これを避けるには、列を明示的に列挙する方法があります。 たとえば、以下の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);
多くのユーザは常に列名を列挙する方法が優れていると考えています。
値が分からない列については、省略することができます。 省略した列には、デフォルト値が挿入されます。 以下に例を示します。
INSERT INTO products (product_no, name) VALUES (1, 'Cheese'); INSERT INTO products VALUES (1, 'Cheese');
後者はPostgreSQLの拡張機能です。 これによって、列には左から順に指定されただけの値が挿入され、残りにはデフォルト値が挿入されます。
明確にするため、列ごと、あるいは行全体についてデフォルト値を明示的に要求することもできます。
INSERT INTO products (product_no, name, price) VALUES (1, 'Cheese', DEFAULT); INSERT INTO products DEFAULT VALUES;
ティップ: 大量のデータを挿入する"一括ロード"を行う場合はCOPYコマンドを検討してください。 INSERT ほどの柔軟性はありませんが、効率的です。