トップページ⇒php
1001コメント345KB

PostgreSQL

レス数が1000を超えています。これ以上書き込みはできません。
0001名無しさん@お腹いっぱい。2001/05/09(水) 11:36ID:GHX.oCXo
PostgreSQLについて語りましょう。
関連アプリケーション特有の話題は、以下のスレッドへ。

☆関連スレッド
[PHP + PostgreSQL]
http://corn.2ch.net/test/read.cgi?bbs=php&key=983128806
[PHP以外+PostgreSQL]
http://corn.2ch.net/test/read.cgi?bbs=php&key=988929199
[MySQL vs PostgreSQL]
http://corn.2ch.net/test/read.cgi?bbs=php&key=989341364
0925名無しさん@XEmacs03/02/15 23:12ID:???
>>924
oid使え。

hoge=# insert into a (b) values ('memo');
INSERT 28675 1
hoge=# select * from a where oid=28675;
a | b
---+------
1 | memo
(1 row)
0926nobodyさん03/02/15 23:18ID:vyjm8srS
>>925
INSERT されたレコードを特定するという目的ならこれもいいね。
ただ、割り当てられた OID ってどうやって取得するの? 目視?
0927tantei03/02/15 23:37ID:???
★あなたのお悩み解決致します!!
●浮気素行調査
彼氏、彼女、妻、夫の浮気を調査致します!!
●盗聴器盗撮機発見
あなたの部屋に誰かが仕掛けているかも!!
●行方調査
行方不明になっている家族の消息を調査致します!!
●電話番号から住所割り出し
一般電話、携帯から住所を割り出し致します!!
●ストーカー対策
社会問題ともなっているストーカーを撃退致します!!
その他人生相談からどんなお悩みでも解決いたします!!
 24時間受付  090−8505−3086
URL  http://www.h5.dion.ne.jp/~grobal/
メール  [email protected]
   グローバル探偵事務局 

0928nobodyさん03/02/15 23:37ID:???
>>926
大抵のクライアントライブラリには最後の INSERT の結果の oid を得るって
関数が用意されてるみたいだけど。
0929nobodyさん03/02/17 12:16ID:???
結果セットを返すplpgsqlの関数を作ってExcelから呼び出したいのですが、

CREATE OR REPLACE FUNCTION f(date) RETURNS SETOF record AS '
DECLARE r record;
BEGIN
 FOR r IN
  SELECT sore,kore FROM t WHERE $1 <= sore and sore < $1+''1month''::interval
 LOOP
  RETURN NEXT r;
 END LOOP;
 RETURN;
END;' LANGUAGE 'plpgsql';

結果セットのカラムと型をExcelの中にぐじゃぐじゃ書かなくてはなりません

Selection.QueryTable.Sql = "SELECT * FROM f('2003-2-17') AS q(s date, k numeric);"

実際はもっとカラム数が多いのでタイヘンです。できれば、

Selection.QueryTable.Sql = "SELECT * FROM f('2003-2-17');"

だけで済ませたいのですが、いい方法はあるでしょうか? verは7.3.1です
0930nobodyさん03/02/18 00:43ID:IIRaGRbN
>>929これなら普通のSQL関数でいいだろ? それはさておき、

返したい列名を定義したテーブルかビューを作っておいて
RETRUNS SETOF テーブル名 AS
ってしてやりゃ、期待通りの動作をするよ。

PostgreSQLは、テーブルやビューはClass(=型)定義として使える。
それを応用するってこった。
0931nobodyさん03/02/18 12:06ID:???
>>930
>返したい列名を定義したテーブルかビューを作っておいて
ビューを作ってうまく行きました。有り難うございます。

CREATE OR REPLACE VIEW v AS
 SELECT sore, kore FROM t WHERE false;

CREATE OR REPLACE FUNCTION f(date) RETURNS SETOF v AS '
 SELECT sore,kore FROM t WHERE $1 <= sore and sore < $1+''1month''::interval
' LANGUAGE 'sql';
0932 03/02/19 15:56ID:ce+34SG0
レコード単位の内容が変わった Last Update みたいなtimestamp情報
を取得する方法を教えてください?
0933nobodyさん03/02/19 16:44ID:???
特に知りたくは無いかも....
0934nobodyさん03/02/19 16:45ID:???
ていうか、timestampのフィールドにデフォルト値を設定すればいいのでは・・・。
そもそも更新日時を取りたいという発想自体が間違いだと思うが。
0935nobodyさん03/02/19 17:38ID:???
ほかにいい方法があるのかもしれないけど、
とりあえずそれ用のフィールドを作って、更新時のトリガーで時間を設定。

重要なテーブルに関してはログと証拠を残すという意味で
そういう手段をほどこしたほうがいいんじゃないかな。
まぁ、物理的にログを残す動作をしておかなければわからないということかな。
0936nobodyさん03/02/20 13:04ID:???
>932
こう言うこと?
create table hoge (i integer, t timestamp default current_timestamp);
hoge=# insert into hoge (i) values (12);
hoge=# select * from hoge;
i | t
----+-------------------------------
12 | 2003-02-20 13:01:45.227974-05
(1 row)

で更新時にtimestamp入れればいいんでないかと?
hoge=# update hoge set i=23, t=current_timestamp where i=12;
UPDATE 1
hoge=# select * from hoge;
i | t
----+-------------------------------
23 | 2003-02-20 13:07:11.440763-05
(1 row)
093793203/02/21 15:20ID:???
みなさんありがとうございます

>>934 >>936
やっぱり、テーブルのフィールドにタイムスタンプを設けて
置くしか手は無いんですよね、、、いや、
「あれ?知らない間にデータが変わってる・・・
 いついじったんだろ?これ・・・・時間帯がわかれば
 誰がやったか想像つくなぁ・・・」
ってことがありまして、、、それで、知りたいなって
思ったんです。今後、こういうことが起きてもいいように、

timestamp型のフィールドを設けて
更新時にはカレントを突っ込むようにします。
ありがとうございました。
0938nobodyさん03/02/24 00:42ID:???
timestamp型なんですが、過去の値から現時刻までの日数を取得したいと思って
いろいろやってみたんですが、なかなかうまくいきません。

マニュアルで to_char や EXTRACT の部分を見てもそれらしいものが載ってません。

どなたかやってるかたがいましたら教えてください。
0939nobodyさん03/02/24 00:57ID:???
実際にやったことはないんだけど、やるとしたら、
過去の値と現在の時刻をエポックに変換して、
一日の秒数で丸めて、
現在から過去を引いて一日の秒数で割って日数を出す、

かなぁ。
0940nobodyさん03/02/24 09:51ID:???
>>938
select date_trunc('day',now() - '1900-1-1'::timestamp);
0941nobodyさん03/02/24 12:35ID:???
>>938
940のようなやり方、なんかの参考書には書いてあったなあ。
公式ページを書籍化したやつだったかも。
おれもおんなじような事でけっこう悩んだ記憶が。
094293603/02/24 14:37ID:???
横レスですが>>940勉強になります。
936 の hoge テーブルでやってみました。

hoge=# select i, t, date_trunc('day', now() - t) from hoge;
i | t | date_trunc
----+-------------------------------+------------
23 | 2003-02-20 13:07:11.440763-05 | 4 days
(1 row)
094394003/02/24 15:53ID:???
すまん、適当に書いてます。>>940
date型を足し引きすれば日数が返ってくる。
>>942だと、
select now()::date- t::date from hoge;
で、数値のみが返ってくると思う。
0944nobodyさん03/03/07 14:11ID:ZFWCWq3y
PostgreSQL 7.2.3からPostgreSQL7.3.2に変更したところ、
lo_unlinkを使用する箇所でエラーと言われました。
もちろん使用しなければエラーと言われません。
動作的に使用しなくても問題はないように思えます。

同じ症状になった人居ますか?

「環境」
Red Hat Linux 7.2
PostgreSQL7.3.2
php-4.2.3
apache_1.3.27
0945nobodyさん03/03/07 19:36ID:???
>>944
心あたりはあるが、マルチのせいでどこに情報を集めるつもりなのか分からん。
0946sage03/03/08 17:37ID:/lGvRuDK
>>954
よろしくお願いします。
0947nobodyさん03/03/09 16:41ID:???
てゆーか小泉うざい。自分のアフォさを客のせいにすんなっつーの。
最後まで客のせいにしてるよ。
0948nobodyさん03/03/09 18:33ID:???
小泉@コイズコムデジタルワークス晒し上げ。
書けば書くほどDQNがばれてんのがわからんのか。
ど素人じゃねぇかよ。ワナビーかっつーの。
0949nobodyさん03/03/09 18:36ID:???
> > マシンが非力(single celeron 800MHz)だったので、ハードウェアのアップ
> > グレードを提案したが、却下(T_T)。
> とか、
> > どうせ作り直すなら…と、一応試してみようとは思ってますが、それであれほ
> > ど速くなるとはにわかには信じがたく(むしろ遅くなるような気が…)、もし
> > かしてJDBCなんかを使ってないか?などと疑ってます。
> とか、
> なんだか、語るに落ちた感がありますが。

そんなに恥ずかしい事を言っているつもりはなかったのですが(^^;;;
いや、お恥ずかしい限りです。


> いやこの際、素人なのでしっかり勉強しますって気持ちで取り組むのも大切かと。(^
^;

自分よりスキルの高い人間が身近にいない(というか、諸々のML以外では見た
こともない)というのは、良くないですね。忙しさに甘んじて勉強を怠っては
いかん、ということがよくわかりました。
0950小泉に指導される連中って・・・03/03/09 18:37ID:???
> うちの場合、PL/pgSQLでやれることはなるべくやらせて、それでも重くなる
> コアなコードはCで書いて組み込むこともあります。
> PHPは入出力と画面遷移、そしてセッション管理だけに専念してくれれば
> いいのではないでしょうか。という発想。

これはやってます(^^)

うちの若いプログラマは、「SQLは嫌いだー」といってなんでもPHPでやろうと
するので、SQLでできないことをPHPでするように口を酸っぱくしています(^^;
0951nobodyさん03/03/09 18:44ID:0jalCBaQ
零細のワンマン社長が井の中の蛙だってのはよくある話。
営業力があって開発に口出さなきゃいい社長になるんじゃないの?
現実には自分よりできる人間は部下にできないだろうがなー(藁

つーかコイズコムデジタルワークス社員は降臨せよ
0952nobodyさん03/03/09 18:51ID:???
     ∧_∧∩ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
    ( ´∀`)/<先生!こんなのがありました!
 _ / /   /   \___________
\⊂ノ ̄ ̄ ̄ ̄\
 ||\        \
 ||\|| ̄ ̄ ̄ ̄ ̄||
 ||  || ̄ ̄ ̄ ̄ ̄||
http://saitama.gasuki.com/shinagawa/
0953小泉@コイズコムデジタルワークス03/03/09 20:10ID:???
> 話の発端としては、基本設計が悪い(破綻してる)のを他人のせいにしているよ
> うにしか見えません。今見直してどうにかできるなら、最初からそういう設計は
> しないでしょう。

他人のせいにはしているつもりはありません。
0954nobodyさん03/03/09 20:14ID:???
本人はしてるつもりはなくてモナー
あの一連の話をクライアントが見たら。。。
とかは考えないんだろうな。、きっと。
0955nobodyさん03/03/09 20:43ID:???
ま、祭?
0956nobodyさん03/03/10 01:47ID:dDkCRfq2
このスレすごいね。小泉もひどいが、他の奴らも
次々と適当な情報流しまくってる。
なんでドキュソはこう誘発するかねぇ。
0957nobodyさん03/03/10 02:59ID:???
なんちゅうか"DB設計の不備"以外の何者でもない話に
何故あんなに盛り上がるのか。何故あんなに怪しい情報が
錯綜するのか。つかみんな"よく知らないですが"って言い過ぎ(w
想像だけであんなにカキコしてどーすんだべ。
0958nobodyさん03/03/10 03:17ID:???
>よく知らないですが
言い切ると粘着されそうだしなぁ。。。明らかに間違ってるのもあったけど。
まあ、あれは設計しなおさないとダメだろう。
小手先修正で自滅していった歴史を披露してたが、学習してないんだろうか(w

実際に担当してるプログラマのことも言ってたけど、同じプログラマとして彼が不憫で仕方ない...
0959nobodyさん03/03/10 03:26ID:???
>>957
「詳しくわかりませんが」はいいけど、「よく知らないですが」はどうかと。
推測ならまだいいけど、想像でっていうのはどうかと。
0960nobodyさん03/03/10 06:22ID:???
類は友を呼ぶ、つーか、DQN呼びすぎ。

PostgreSQLがタダだからってDQN技術者が増えると、
PostgreSQLまでDQNだと思われるよ。。
0961nobodyさん03/03/10 11:08ID:???
pgsql-jp で信じていい人と信じないほうがいい人を
おしえて下さい。
0962nobodyさん03/03/10 12:37ID:???
>>961
教えて君なら皆信じろよ。
間違いを教えられて失敗しても、それが上達の近道。
0963nobodyさん03/03/10 21:36ID:???
K6-3の600MHzマシン(メモリ80M)に入れて
最近使い始めたのですが、遅いです。
CSE使用時の表示で応答時間2.6秒

SQL文の書き方やインデックスの使い方がヘタレ、等の
原因の方が大きいかと思いますが、
単純にマシンをパワーアップさせた場合
処理の高速化にどれくらい効果があるんでしょうか?
あほな例えですがPen4やAthlonの最高速、メモリ1Gとかに変えたとして
今より劇的に速くなったりするんでしょうか。

それとも処理の中身を勉強して最適化した方が有効でしょうか?
インデックス使うとその項目の検索で早くなるんだなぁ、程度の知識ですので・・・
0964nobodyさん03/03/10 22:17ID:???
>963
おまえ、ワザとやってるだろ、、、
0965nobodyさん03/03/10 22:32ID:???
>>963
何をやって2.6秒かかったのか詳細に書かなきゃ答えようがない
100万レコード取得しようとして2.6秒ならかなり速いと思うが。
096696303/03/10 23:48ID:???
こんな感じの。

select あ,い,う,え,お,か,き,く,AA.け,こ,さ,し,AA.す,せ,AA.そ
from AA LEFT JOIN BB on (AA.た = BB.た and AA.ち = BB.ち),CC,DD
whereAA.け=CC.け
and AA.す=DD.す
order by CC.つ,CC.て,CC.と,BB.な,AA.し,DD.す

AAは10000レコード、BB、CC、DDはそれぞれ1000レコードずつくらい。

・・・だめだ、自分で書いててよく判らん。
出直してくるよ。
0967nobodyさん03/03/11 00:36ID:???
>>961
漏れの投稿は信じていいYO!
0968nobodyさん03/03/11 00:52ID:???
>>961
いや、>>967の言うことは信じちゃだめだ!漏れを信じれ!
0969nobodyさん03/03/11 01:19ID:???
とりあえずforceを信じるところから始めようか。
いやむしろ自分か。
0970nobodyさん03/03/11 01:30ID:???
>>961
他人を信じてはいけない。頼れるものは自分のみ。
0971nobodyさん03/03/11 01:53ID:???
>>966
最終的に返ってくるレコード数にもよるけど、もっと速くなりそう。
Explainで実行プランを確認してみ。
Seq scanって出てくるところがあったら、indexつけてvacuumかけて
またExplainしてみてindex scanに変わるかどうか調べる。その繰り返し。

遅いからって短絡的にCPUを速くすればなんて言ってると>>949みたくなるぞ
0972nobodyさん03/03/11 02:00ID:???
K6-III自体は整数演算/Hzの性能は上々だからなあ。
単純にメモリ足んないんじゃないの?
0973nobodyさん03/03/11 02:21ID:???
パート2はまだでつか?
097497303/03/11 02:36ID:???
たてますた
[PostgreSQL 2テーブル目]
http://pc2.2ch.net/test/read.cgi/php/1047317680/
0975nobodyさん03/03/12 19:14ID:???
Windowsで動くPostgreSQL
http://hp.vector.co.jp/authors/VA023283/PostgreSQL.html

これ使おうと思ったんですが、
create database出来ますか?
initdb.exeで一つしか作れないんですが…
手としてはフォルダコピーして使うとかでしょうか。
0976nobodyさん03/03/12 20:05ID:???
>>975
そういう仕様です。
0977nobodyさん03/03/12 20:29ID:???
>>976
沈みかけのスレなのに
ご回答ありがとうございまつ。
PHPとかの書き方もちょっと違う感じだし、
cygwin+pgにしておきます。
0978nobodyさん03/03/12 20:45ID:???
>>977
PHPの書き方は一緒だろ。
俺の場合本鯖はLinuxなんだが、scriptはWinで書いている。
データベース名が違うのでconnect文だけ環境によって
切り替えるようにしておけば、まったく同一のscriptで桶でし。
0979山崎渉03/03/13 17:04ID:???
(^^)
0980nobodyさん03/03/13 21:00ID:???
抽出条件に limit と offset を使うと便利ですが、以下のようなことができなくて
悩んでいます。

WHERE ID=1 ORDER BY T_STAMP DESC limit 5 ORDER BY T_STAMP ASC

これで最後から5つのデータを昇順に取得できません。ORDER BY 句は複数使えない
ようで、offset に -5 などとマイナス値を与えてもエラーがでます。

結局わたしのテーブル設計がまずいとは思いますが、どなたか出来るかたレスください。
0981nobodyさん03/03/13 22:38ID:???
select * from (select * from table where ID=1 order by T_STAMP limit 5) as foo order by foo.T_STAMP asc;
かな。
0982nobodyさん03/03/13 23:33ID:sXZYIvtY
厨な質問ですが教えて下さい
Red Hat 8.0でpostgresql-7.2.2-1を使い始めました
いろんな解説をネットでみてたらインストールしてはじめてPostgreSQLを起動すると
# su - postgres
とすると、スーパーユーザーで起動しデータベースを初期化しますよねそんであとからユーザーを追加するのは

# su -postgres
$ -bash2.05$ createuser foo

....y or nで2、3問質問に答えたら

CREATE USER foo

とめでたく、fooというユーザーが登録出来たのですが
では、いざユーザーネームfooでデータベースを作ったりPostgreSQLに接続するにはどうしたらいいのでしょうか?
ほとんどのPostgresqlのHPの解説ではユーザーの追加までは同じようなことが
詳しくでてますけど、ユーザーでPostgreSQLを起動したり、データベースを作成する解説が少ないと思います、なにも知らない、ど素人なんでスーパーユーザーでやってたら、怖いので宜しく教えて下さい。
0983nobodyさん03/03/13 23:49ID:???
createuser したときにデータベースを作成させる権限を与えておかないと
データベースは作成できない。
与えていたら、createdbで作成できる。

0984nobodyさん03/03/14 00:03ID:bLaxbE1P
>983
サンクス
$ su - postgres
Password:
-bash-2.05b$ createuser foo with password foo
Shall the new user be allowed to create databases? (y/n) y
Shall the new user be allowed to create more new users? (y/n) n
CREATE USER
-bash-2.05b$ su - foo
su: user foo does not exist
-bash-2.05b$
こうなるうですが.....
0985nobodyさん03/03/14 00:23ID:???
>>984
ぉぃ。先に実ユーザをつくっとかんと...
#adduser foo
0986nobodyさん03/03/14 00:35ID:bLaxbE1P
>985さん
サンクス
はずかしいです、できました
098797403/03/14 03:24ID:???
この板では974での次スレは早すぎか。。。
0988nobodyさん03/03/14 10:42ID:???
PostgreSQL って BLOB や CLOB 使えるの?
0989nobodyさん03/03/14 16:23ID:???
ヽ(´ー`)ノ
0990nobodyさん03/03/14 21:14ID:???
>>988
BLOBは使えるYO
0991nobodyさん03/03/14 23:33ID:???
CLOB の利点って何? Text 型じゃダメなの?
0992nobodyさん03/03/14 23:55ID:???
>>991
LOBの特徴を持ちつつ、エンコーディングの変換だけはするということかな?
textはタプルサイズの制約に縛られるから。
0993nobodyさん03/03/15 02:10ID:???
>>990-992
ThanX!
いつもは DB2 使いなんだが今度使ってみるか。
0994nobodyさん03/03/15 03:59ID:???
PostgreSQL 2テーブル目
http://pc2.2ch.net/test/read.cgi/php/1047317680/l50
0995nobodyさん03/03/15 03:59ID:???
こっちに移動しる
PostgreSQL 2テーブル目
http://pc2.2ch.net/test/read.cgi/php/1047317680/l50
0996nobodyさん03/03/15 05:15ID:???
(´-`).。o○(なんで1000取りも埋めもいないんだろう…)
0997nobodyさん03/03/15 11:17ID:YPCssbUz
PHPでPostgreSQLにデータを引き渡すソースを書いているのだが
Parse error:
ばっかりでデバックが難しい、POSTメッソドでデータ入力まではうまく動くのだが、SQL文を書くと同じエラーばっかりだ
Parse error: parse error, unexpected $ in〜 line(最後の行)
PHPでもPostgreSQLでもいいから一行ずつトレースするデバッガーってないのかな?
0998nobodyさん03/03/15 11:34ID:???
>>997
それは PHP のパースエラー。スレ違い。

先に SQL 文のひな形を作って、データを sprintf() で埋め込んで
Postgres に渡す SQL を作るようにしてごらん。ミスを防げる。
099999903/03/15 11:34ID:???
999
1000次スレ03/03/15 11:35ID:???
PostgreSQL 2テーブル目
http://pc2.2ch.net/test/read.cgi/php/1047317680/l50
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。