第4回:テーブルを作っていじる(2)


テーブルにデータを入れる

前回で address テーブルを作ったので、そいつにデータを入れてみたい。 データを入れるには SQL の INSERT 文を使う。 SQL 文は psql ターミナルから打ち込む。こげな文になると思われ。
INSERT INTO address (name, tel, email)
	VALUES ('Watashi', '234-8900', 'aa@bb.net');
改行があるけど本当は1行です。
しかし、いちいち psql からこげな文を入力できるかい。
うれしいことに、外部ファイルから流し込む方法があった。あたり前か。
前回の最後で address テーブルを削除しちゃったので、address テーブルを作るとこからデータを挿入するとこまでの SQL 文を書いちゃう。 以下の内容のテキストファイルをファイル名 create1.sql で作る。
CREATE TABLE address (
        name varchar(50),
        tel varchar(50),
        email varchar(50)
);

INSERT INTO address (name, tel, email)
        VALUES ('Watashi', '234-8900', 'aa@bb.net');
INSERT INTO address (name, tel, email)
        VALUES ('Omae', '321-0000', 'ff@bb.net');
INSERT INTO address (name, tel, email)
        VALUES ('Anta', '234-0000', 'dd@ff.net');
見やすいようにインデント付けてみた。
で、psql で流し込む。
postgres$ psql mydb
mydb=# \i create1.sql
CREATE
INSERT 16621 1
INSERT 16622 1
INSERT 16623 1
うまくいったか SELECT で一覧表示してみる。
mydb=# SELECT * FROM address;
  name   |   tel    |   email
---------+----------+-----------
 Watashi | 234-8900 | aa@bb.net
 Omae    | 321-0000 | ff@bb.net
 Anta    | 234-0000 | dd@ff.net
(3 rows)
うまくいったね。
外部ファイルに書いたとしてもだ、INSERT 文を羅列するのはめんどくさ。
タブ区切りで書かれたデータを挿入するやりかたがあった。あたり前か。
SQL の COPY を使うとタブ区切りデータを挿入できる。 copy.sql として以下のファイルを作ってみる。
COPY address FROM stdin;
Hoo	34-00256	rr@jj.com
Zcc	456-0955	yy@pp.hh
Good	5667-666	tt@pp.hh
\.
そいで実行・一覧表示と。
mydb=# \i copy.sql
mydb=# SELECT * FROM address;
  name   |   tel    |   email
---------+----------+-----------
 Watashi | 234-8900 | aa@bb.net
 Omae    | 321-0000 | ff@bb.net
 Anta    | 234-0000 | dd@ff.net
 Hoo     | 34-00256 | rr@jj.com
 Zcc     | 456-0955 | yy@pp.hh
 Good    | 5667-666 | tt@pp.hh
(6 rows)
うまくいきました。

外部ファイルからデータを挿入

外部ファイルからデータを出し入れするには psql の \copy コマンドを使うやり方もある。
\copy コマンドって言っても内部的には SQL の COPY をガッツンガッツン実行しているらしいので、速度を求めるなら COPY を使うとうれしいらしい。
書式は以下のようになっとる。
\copy table [ with oids ] { from | to } filename | stdin | stdout [ using delimiters 'characters' ] 
よくわからんけど、試しに CSV ファイルを作って挿入してみる。 ファイル名 input.csv で以下のようなファイルを作りーの、、
どなたか,444-000,jj@ppp.ne
お前さん,666-000,88@pp.kk
山田くん,667-00,67y@pp.kk
ドラミちゃん,678-098,tt@ok.ne
日本語を入れてみた。注意したいのは文字コード。
Linux だけん、EUC+LF で保存する。FTP で上げるときもバイナリモードで上げる。
それで \copy を実行。
mydb=# \copy address FROM input.csv USING DELIMITERS ','
\.
いい感じ。うまくいったか一覧表示。
mydb=# SELECT * FROM address;
     name     |   tel    |   email
--------------+----------+-----------
 Watashi      | 234-8900 | aa@bb.net
 Omae         | 321-0000 | ff@bb.net
 Anta         | 234-0000 | dd@ff.net
 Hoo          | 34-00256 | rr@jj.com
 Zcc          | 456-0955 | yy@pp.hh
 Good         | 5667-666 | tt@pp.hh
 どなたか     | 444-000  | jj@ppp.ne
 お前さん     | 666-000  | 88@pp.kk
 山田くん     | 667-00   | 67y@pp.kk
 ドラミちゃん | 678-098  | tt@ok.ne
(10 rows)
しめしめ。日本語もちゃんと表示されました。

んで次に、こいつらを CSV ファイルに書き出してみる。
mydb=# \copy address TO out.csv USING DELIMITERS ','
ちゃんと書き出されたか?
postgres$ cat out.csv
Watashi,234-8900,aa@bb.net
Omae,321-0000,ff@bb.net
Anta,234-0000,dd@ff.net
Hoo,34-00256,rr@jj.com
Zcc,456-0955,yy@pp.hh
Good,5667-666,tt@pp.hh
どなたか,444-000,jj@ppp.ne
お前さん,666-000,88@pp.kk
山田くん,667-00,67y@pp.kk
ドラミちゃん,678-098,tt@ok.ne
うまくいったようや。ちなみに out.csv は EUC+LF になる。
('02.11.28)

Back