postgresql
インサート
サーチ…
基本INSERT
personという簡単なテーブルがあるとしましょう:
CREATE TABLE person (
person_id BIGINT,
name VARCHAR(255).
age INT,
city VARCHAR(255)
);
最も基本的な挿入は、テーブルにすべての値を挿入することです。
INSERT INTO person VALUES (1, 'john doe', 25, 'new york');
特定の列のみを挿入する場合は、明示的に列を指定する必要があります。
INSERT INTO person (name, age) VALUES ('john doe', 25);
NOT NULLのような制約がテーブルに存在する場合は、どちらの場合でもこれらの列を含める必要があることに注意してください。
複数の行を挿入する
同時に複数の行をデータベースに挿入することができます。
INSERT INTO person (name, age) VALUES
('john doe', 25),
('jane doe', 20);
選択から挿入
select文の結果として表にデータを挿入できます。
INSERT INTO person SELECT * FROM tmp_person WHERE age < 30;
selectの投影は、挿入に必要な列と一致する必要があることに注意してください。この場合、 tmp_person
表はperson
と同じ列を持ちます。
COPYを使用してデータを挿入する
COPYはPostgreSQLの一括挿入メカニズムです。これは、ファイルとテーブル間でデータを転送する便利な方法ですが、一度に数千を超える行を追加する場合は、 INSERT
よりもはるかに高速です。
サンプルデータファイルを作成しましょう。
cat > samplet_data.csv
1,Yogesh
2,Raunak
3,Varun
4,Kamal
5,Hari
6,Amit
そして、このデータをインポートできる2つのカラムテーブルが必要です。
CREATE TABLE copy_test(id int, name varchar(8));
実際のコピー操作では、テーブルに6つのレコードが作成されます。
COPY copy_test FROM '/path/to/file/sample_data.csv' DELIMITER ',';
ディスク上のファイルを使用する代わりに、 stdin
からデータを挿入することができます
COPY copy_test FROM stdin DELIMITER ',';
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> 7,Amol
>> 8,Amar
>> \.
Time: 85254.306 ms
SELECT * FROM copy_test ;
id | name
----+--------
1 | Yogesh
3 | Varun
5 | Hari
7 | Amol
2 | Raunak
4 | Kamal
6 | Amit
8 | Amar
また、以下のようにテーブルからファイルにデータをコピーすることもできます:
COPY copy_test TO 'path/to/file/sample_data.csv' DELIMITER ',';
INSERTデータとRETURING値
自動増分列を持つ表にデータを挿入する場合、および自動増分列の値を取得する場合は、次のようにします。
my_table
というテーブルがあるとしmy_table
。
CREATE TABLE my_table
(
id serial NOT NULL, -- serial data type is auto incrementing four-byte integer
name character varying,
contact_number integer,
CONSTRAINT my_table_pkey PRIMARY KEY (id)
);
my_table
データを挿入し、その行のIDを取得する場合は、次のようにします。
INSERT INTO my_table(name, contact_number) VALUES ( 'USER', 8542621) RETURNING id;
上のクエリは、新しいレコードが挿入された行のIDを返します。
データをファイルに選択します。
テーブルをCOPYしてファイルに貼り付けることができます。
postgres=# select * from my_table;
c1 | c2 | c3
----+----+----
1 | 1 | 1
2 | 2 | 2
3 | 3 | 3
4 | 4 | 4
5 | 5 |
(5 rows)
postgres=# copy my_table to '/home/postgres/my_table.txt' using delimiters '|' with null as 'null_string' csv header;
COPY 5
postgres=# \! cat my_table.txt
c1|c2|c3
1|1|1
2|2|2
3|3|3
4|4|4
5|5|null_string
UPSERT - INSERT ... ON CONFLICT DO UPDATE ...
バージョン9.5の postgresはINSERT
文でUPSERT
機能を提供しているからです。
前述のいくつかの例で作成されたmy_tableというテーブルがあるとします。行を挿入し、挿入された行のPK値を返します。
b=# INSERT INTO my_table (name,contact_number) values ('one',333) RETURNING id;
id
----
2
(1 row)
INSERT 0 1
既存の一意キーを持つ行を挿入しようとすると、例外が発生します。
b=# INSERT INTO my_table values (2,'one',333);
ERROR: duplicate key value violates unique constraint "my_table_pkey"
DETAIL: Key (id)=(2) already exists.
Upsert機能は、とにかくそれを挿入する機能を提供し、競合を解決します:
b=# INSERT INTO my_table values (2,'one',333) ON CONFLICT (id) DO UPDATE SET name = my_table.name||' changed to: "two" at '||now() returning *;
id | name | contact_number
----+-----------------------------------------------------------------------------------------------------------+----------------
2 | one changed to: "two" at 2016-11-23 08:32:17.105179+00 | 333
(1 row)
INSERT 0 1