板違い
4 :
名無しさん@お腹いっぱい。:03/06/30 16:47 ID:Lf/h8tD9
age
6 :
名無しさん@お腹いっぱい。:03/07/01 15:20 ID:VDdZprIm
age
PostgreSQLでreadlineを有効にしてmakeする方法で苦戦
8 :
名無しさん@お腹いっぱい。:03/07/08 23:41 ID:7Q6wUFCE
PostgreSQLをインストールするには
どんなOSがお勧めでしょうか?
12 :
名無しさん@お腹いっぱい。:03/07/10 12:54 ID:ccIJBBJP
レコード追加したらカウンターフィールドを自動カウントアップする
変数定義ってあったっけか。
auto-countみたいなのってPostgreSQLじゃfunctionかtrigger使わなきゃ
出来ないんだっけか。
13 :
名無しさん@お腹いっぱい。:03/07/10 13:14 ID:PSgpDgQ5
serial
14 :
12:03/07/10 13:30 ID:ccIJBBJP
>13
アンガト^^/~
16 :
名無しさん@お腹いっぱい。:03/07/13 15:11 ID:0aiQXehE
Linuxにさ。最新版のPostgres入れようと思ってるんだけどさ。
zlibがないとか文句を言ってくるんだよね。
OpenSSLがないとかreadlineがないとか散々文句を付けられちゃってさ。
ハァ------・・・・・もうインストールに疲れちゃった。
あぼーん
>>16 アフォくさ・・・
どのディストリに、なんのバージョンを入れようとしたんだか。
大体、OSインスコ腐ったやりかたしてたら、排卵わな(呆
昔はあんなに苦労しなかったのに。
7.3.3を入れてみたよ。
TurboLinux8 Server。とりあえずPostgreSQLのRPMを消してみた。
readlineのRPMも消してmakeで入れてみた。
ところでmakeがgmakeかどうかを判断するにはどうすりゃいい?
やっぱりRPMなんて一個も使わないほうがいいかね?
21 :
名無しさん@お腹いっぱい。:03/07/13 23:36 ID:dgge6JpE
誰か、PGReplicateとか使ってDBの冗長化させている人いる?
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
33 :
山崎 渉:03/07/15 11:17 ID:???
__∧_∧_
|( ^^ )| <寝るぽ(^^)
|\⌒⌒⌒\
\ |⌒⌒⌒~| 山崎渉
~ ̄ ̄ ̄ ̄
>19
「make love」って打って、
> make: don't know how to make love. Stop
って出たらBSD make。
> make: *** No rule to make target `love'. Stop.
って出たらGNU make。
>>34 make: *** ターゲット `love' を make するルールがありません. 中止。
36 :
名無しさん@お腹いっぱい。:03/07/18 00:40 ID:uqrcCnPj
>16
readline はインストールされてるが、pgsql では使えない事があった。
configure のオプションでlib のdirを指定したらいけた。
半年前なので、詳細(というか正しい知識)忘れてしまった。
37 :
名無しさん@お腹いっぱい。:03/07/19 13:37 ID:VmaBZmB4
今、Accessで構築されてるデータベースをPostgreSQLに
移行したいのですが、なんかいい方法ありますか?
38 :
名無しさん@お腹いっぱい。:03/07/19 13:54 ID:bDyX28yi
あぼーん
また一波乱ありそうな気配
>40
pgsql-jp?
>>37 PostgreSQL+Perl?PostgreSQL+PHP?
Accessからブラウザベースのツールに移る場合、
それなりに設計しなおしの部分も出てくるだろうから、
1.現状のシステムの動作を解析。
2.新規要望がないか調査
3.DB(テーブル)並びにシステムの設計
4.システム構築
5.データ移行
と再構築をしっかりやりたい(僕なら)
PostgreSQL 7.2.3+PHP 4.2.3 でデータベースを構築しています。
あるテーブルを、ユーザーが選択した行だけを表示するようにしたいのですが、
どのように行ったらいいでしょう?
テーブルにはユニークな番号が振ってあるので、ユーザー毎にIDを登録したテーブルを
作って、JOINすればいいかなと思ったんですが、そうするとユーザー毎にテーブルが
必要だし、同じDB内では管理が面倒になりそうなのですが、
DBを分けてしまうとJOINができなくなってしまうので、どうしたらいいものか悩んでいます。
何かいい方法ありますか?
44 :
名無しさん@お腹いっぱい。:03/07/22 12:32 ID:MV56GWLi
>>43 ユーザー毎にフラグ設ける方法以外に考えられないと思われ。
一瞬で分かるだろ。
>43
> テーブルにはユニークな番号が振ってある
この一節読んだだけで嫌な予感がしまつ。
46 :
43:03/07/22 14:42 ID:???
>>44 やっぱりユーザー毎にフラグ設けるしかないですか。
ありがとうございました。
>>45 テーブルに番号が振ってあるんじゃなくて、行ごとに振ってあるの間違いでした。
ど素人が作ったDBなので、ほかにもいっぱい問題はありそうですが..
:: 1テーブルだと、INSERT SELECT共にとても重くなって現実的ではないと思い
:: ます。なにせ、めったにアクセスされない掲示板のレコードにも頻繁にアク
:: セスが生じますし。まだ1万個のテーブルのほうがましだと思います。
実際にやると、1万個のテーブルのほうが激遅くなる罠。
joinとかが発生せずそれぞれ独立に動くなら1万個のテーブルでも
いいのではないかとは思うが、
> :: 1テーブルだと、INSERT SELECT共にとても重くなって現実的ではないと思い
> :: ます。なにせ、めったにアクセスされない掲示板のレコードにも頻繁にアク
> :: セスが生じますし。まだ1万個のテーブルのほうがましだと思います。
ってもしかしてインデックスも張らずにやるつもりなのかな?
それにレコード増えてもINSERTはそれなりに速いぞ。
追記型のストレージだからな。
インデックスでユニーク制約をしたキーがあるテーブルを継承しても、
継承したテーブルではキーの重複ができるのですが仕様でしょうか?
もしかして、この場合インデックス自体有効でないのでしょうか?
PostgreSQLは7.2.3です。
50 :
自己レス:03/07/23 16:14 ID:???
51 :
名無しさん@お腹いっぱい。:03/07/25 15:28 ID:YD/oGCu5
だめすぎって、マニュアルも読まない君のことか?
あぼーん
あぼーん
54 :
名無しさん@お腹いっぱい。:03/07/29 23:29 ID:kKpllBVe
PostgreSQLでバラバラの度々同じ条件でテーブルを連結して検索させたいとき、
1.検索の度にjoin使う。
2.ビューを作っておく。
3.関数を作っておく。
テーブル設計がいじれ無い状況で、どれが一般的に速いものなのでしょうか?
55 :
54:03/07/29 23:30 ID:kKpllBVe
誤:PostgreSQLでバラバラの度々同じ条件でテーブルを連結して…
正:PostgreSQLでバラバラのテーブルを度々同じ条件で連結して…
あぼーん
>54
どれもほとんど変わらんと思われ。
prepare使うと変わるかもしれんけどね。
58 :
54:03/07/31 00:34 ID:???
>57
7.3からprepare使えるみたいですね。
ちょっくら試してみます。
ありがとうございました。
∧_∧ ∧_∧
ピュ.ー ( ・3・) ( ^^ ) <これからも僕たちを応援して下さいね(^^)。
=〔~∪ ̄ ̄ ̄∪ ̄ ̄〕
= ◎――――――◎ 山崎渉&ぼるじょあ
60 :
名無しさん@お腹いっぱい。:03/08/13 15:08 ID:qSUYsHAO
PostgreSQL って EJB QL の関数をサポートしてないのでしょうか?
例えば、
SELECT
OBJECT(a)
FROM
myTable AS a
WHERE
SUBSTRING(a,userID, 1, 4) = ?1
みたいに EJB QL のSUBSTRING関数なんかを使っていると
java.sql.SQLException: ERROR: parser: parse error at or near "{"
at org.postgresql.core.QueryExecutor.execute(QueryExecutor.java:131)
という例外が発生します。
関数を使わなければ、問題なく抽出が成功するんですけど・・・
SUBSTRINGでtableも指定してるのはそういうもんなの?
62 :
60:03/08/13 16:55 ID:qSUYsHAO
>>61 識別変数 ( 「myTable AS a」 の 「a」 ) はEJB-QLでは省略できない決まりだそうです。
あぼーん
あぼーん
65 :
山崎 渉:03/08/15 21:59 ID:???
(⌒V⌒)
│ ^ ^ │<これからも僕を応援して下さいね(^^)。
⊂| |つ
(_)(_) 山崎パン
66 :
山崎 渉:03/08/15 22:49 ID:???
(⌒V⌒)
│ ^ ^ │<これからも僕を応援して下さいね(^^)。
⊂| |つ
(_)(_) 山崎パン
67 :
名無しさん@お腹いっぱい。:03/08/16 16:02 ID:nn9V5t8B
PostgreSQLで「10日前までのデータを抽出」という条件を指定する方法を教えてください。
……いえ、もちろん、「where between hoge_date 10日前の日付 and 今日」とやればいいのは
解っています(^^; postgreSQLにおいて、whereで使用できる日付計算関数というのがあれば
教えてください、ということです。
この辺、データベースによってバラッバラだし、selectで使えてもwhereぢゃ使えないなんて
腐った関数もあったし……(T_T)
ということで、よろしくお願いします。
>>60 PostgresというよりもEJBコンテナの問題だと思われ。
where hoge_date >= 'today'::date - 10;
70 :
名無しさん@お腹いっぱい。:03/08/16 19:47 ID:asUvlQOh
org.postgresql.coreで発生してるとこを見ると、
JDBCが対応していないようにも思えるが・・・
環境が書いてないんで、何とも胃炎。
あぼーん
あぼーん
73 :
名無しさん@お腹いっぱい。:03/08/17 00:07 ID:UpSkezT2
current_dateとdate型のカラムを使って「現在から何日前/後」という計算を、PostgreSQLで
出来ないでしょうか?
クライアントがPerlなので、あまり日付は扱いたくありません。
いちいちエポック秒に変換するのはちょっと面倒です(^^;
ご経験のある方がいらっしゃいましたら、アドバイスをお願いします
74 :
名無しさん@お腹いっぱい。:03/08/17 00:32 ID:wtT8T4OC
>>70 PostgreSQLの標準JDBCはJDBC2までしか対応してないんじゃないか?
ただコンテナが吐くSQLがそれぞれに適したものを出力しないと意味ない
し、普通コンテナがPostgreSQLをサポートしているのかどうかを確認して
使うべきじゃないかと思ったんだよな。
あぼーん
77 :
73:03/08/17 03:05 ID:pbK6h/9c
>>76 どもです。えっと、単純に
age(Xdate)
でOKなんでしょうか? でもこれ、戻り値はinterval型ですよね。
欲しいのは年月日ではなく、日数なんですよ。つまり、
2002/8/16を評価した場合、-366が(出来ればintで)帰ってきて欲しいんですね。
intervalを日数に変換する関数なんてのがあれば一発なのですが……
文字列比較するのも嬉しくないしなぁ(T_T)
>>77 SELECT EXTRACT(EPOCH FROM age(timestamp '2002/8/16')) / EXTRACT(EPOCH FROM interval '1 day')
かっこわるー
あぼーん
80 :
73:03/08/17 13:36 ID:???
>>78 た、確かに……(T_T)
了解しました。この方式を保険にして、まずはPerlでシコシコ書いてみましょう。
アドバイスありがとうございました。
81 :
60:03/08/17 13:42 ID:???
>>60です。みなさまレスありがとうございます。
環境は以下のとおりです。
OS : Windows2000 Pro SP4
APS : WebLogic Ver 7.0
DB : PostgreSQL Ver 7.2.1 for windows
JDBC: pg73jdbc2ee.jar, pg73jdbc3.jar
JDBCは上記以外のも使ってみましたが、うまくいきませんでした。
DDは、「ejb-jar.xml」「weblogic-cmp-rdbms-jar.xml」ともに以下のように指定しています。
<ejb-ql> (<weblogic-ql>)
SELECT OBJECT(a) FROM myTable AS a WHERE SUBSTRING(a.yyyymmdd, 1, 4) = ?1
</ejb-ql> (</weblogic-ql>)
関数を使わなければ、問題なく成功します。
他のアプリケーション・サーバーでも試してみようと思います。
82 :
名無しさん@お腹いっぱい。:03/08/17 18:51 ID:SwfhiGBA
ポスグレのターミナルプロンプトでデータ表示するときの
--続ける--
表示ってどうやれば消えるのでしょうか?
84 :
名無しさん@お腹いっぱい。:03/08/19 00:51 ID:B12vYhll
ポスグレ固まってしまった。
プロセス確認してみたら、TRUNCATE Waitingってのが
たくさんあるんだよ。
なんでだろう。7.1なんでもちろんTRUNCATEは実行できる
はずなのだが・・・
どっかのプロセスがtruncate対象のテーブルか何かをロックしたままなんじゃない?
86 :
名無しさん@お腹いっぱい。:03/08/20 13:10 ID:d3T9mVf4
ポスグレポ
88 :
名無しさん@お腹いっぱい。:03/08/26 16:52 ID:EXAVYmiZ
where id >= 100 and id <= 1000 と
where id between 100 and 1000 とではどっちが早いですか?
それとも等価ですか?
90 :
88:03/08/26 19:05 ID:???
>>89 このページは見つけられませんでした。ありがとうございました。
y
92 :
名無しさん@お腹いっぱい。:03/08/27 18:21 ID:w7hR2Qx2
PostgreSQL-7.2.1
PostgreSQL ODBC Driver 07.01.0006 日本語版(2001/07/13版)
上記のODBCドライバを使っているんだけれど、
もしかしてこれだとvarchar(20)とかに入れた日本語20文字を取れない?
そもそもODBC関係なくvarchar(20)に日本語は10文字しか入らないのでは?
94 :
名無しさん@お腹いっぱい。:03/08/27 18:37 ID:w7hR2Qx2
7.xくらいからvarcharって文字数ではありませんでしたっけ??
DBはEUCでやってます。
あー、すまん
varchar(10)で確認してたので混同した
うちのはodbc は 7.03.01.00 でvarchar(10) の10文字の漢字が取れました
けっこう最近まで7.01.xxxx 使ってたけど、varcharに日本語入れた事
無かったから気がつかんかったなあ・・・
96 :
名無しさん@お腹いっぱい。:03/08/27 19:12 ID:w7hR2Qx2
7.03って本家(www.postgresql.org)の奴ですか。
日本語版というのがあったので
日本語対応していないのかと思ったのですが本家の方も今のは対応しているのでしょうか?
そのようです
日本語というよりマルチランゲージ対応ですね
あぼーん
>>98 うそぐれすは本体が対応するまでのつなぎのごまかしだし
便利は便利だが、アクセス制限かけにくいので使いづらい、あれ
ていうか、eRserverはトリガベースだったと思うんで、
一概に比較できるもんでもないっそ。
SDにも別のreplicationの記事があったね
日本人がやってたな
103 :
名無しさん@お腹いっぱい。:03/08/29 15:19 ID:aLAEBrwe
こういう型を決めていて
Column | Type | Modifiers
--------+-----------------------------+-----------
date | timestamp without time zone |
dns | text |
ip | inet |
uid | text
データはこのように入れてるのですが
date dns ip uid
2003-08-28 18:55:42.656173 ftp12.sakura.moe 192.168.1.12 sakura
2003-08-28 19:37:26.93341 ftp12.sakura.moe 192.168.1.12 sakura
2003-08-28 19:37:38.796167 ftp12.sakura.moe 192.168.1.12 sakura
2003-08-28 19:37:46.947639 ftp15.sakura.moe 192.168.1.15 tomoyo
2003-08-28 19:52:56.752223 ftp12.sakura.moe 192.168.1.15 tomoyo
2003-08-28 21:06:48.766464 ftp1.sakura.moe 192.168.1.1 abone
これをuidがダブらないように日付が一番新しい情報だけをそれぞれ出したいんですが、select文一行じゃ無理ですか?
上のデータをselectして
2003-08-28 19:37:38.796167 ftp12.sakura.moe 192.168.1.12 sakura
2003-08-28 19:52:56.752223 ftp12.sakura.moe 192.168.1.15 tomoyo
2003-08-28 21:06:48.766464 ftp1.sakura.moe 192.168.1.1 abone
こうだしたいです。
104 :
名無しさん@お腹いっぱい。:03/08/29 15:31 ID:aLAEBrwe
2003-08-28 19:52:56.752223 ftp12.sakura.moe 192.168.1.15 tomoyo
これは
2003-08-28 19:52:56.752223 ftp15.sakura.moe 192.168.1.15 tomoyo
こですね。こぴぺして修正するとき書き間違えました。
遊びでやっているので、気長に待ってます。
お願いいたします。
dns と ip と uid は常に同じ組み合わせなの?
もしそうだったら
SELECT max(date) AS date,uid,dns,ip FROM test4 GROUP BY uid,dns,ip
でいけるけど
ありゃ、uid の場所まちがった。まあわかるよね
107 :
名無しさん@お腹いっぱい。:03/08/29 16:01 ID:aLAEBrwe
>>105 >dns と ip と uid は常に同じ組み合わせなの?
常に同じじゃないです。
ftp18.sakura.moe 192.168.1.18 tomoyo
ftp19.sakura.moe 192.168.1.19 tomoyo
こうデータが入ってくる場合もあります。
じゃあ、こんなかんじ?
SELECT * FROM table WHERE date IN (SELECT max(date) FROM table GROUP BY uid)
オレもあんまし詳しくないんで、もっといいやり方あるかも
109 :
108:03/08/29 16:34 ID:???
あ、これは同じ時刻で違うuidが複数あるとだめだね
110 :
108:03/08/29 16:36 ID:???
こっちでいいかな?
SELECT * FROM table WHERE (uid,date) IN (SELECT uid,max(date) FROM table GROUP BY uid)
112 :
103:03/08/29 18:31 ID:aLAEBrwe
113 :
名無しさん@お腹いっぱい。:03/08/31 14:29 ID:EBOLr2oF
id1とid2を複合キーにして、defaultでid1を見てid2がカウントアップ
していくっていうのは、テーブル作成時にどう指定したらいいんでしょう。。
要するにid1個のテーブルを作成して、そのテーブル内に
serialのid2があるような形のことをテーブル1つでやりたいんですけど。
これってSQLネタなんでしょうか。
なんかこないだまで事務やってたのにいきなりDBの管理やらされて
激しく困っています。。。
意味がよくわからなくてイメージわかない・・
115 :
113:03/09/01 11:11 ID:lfyO0RSp
>>114 すいません。。。
id1 | id2
1 | 1
2 | 1
2 | 2
2 | 3
このような状態でid1に1を指定して
insertした場合は自動的にid2に2が、
2を指定してinsertした場合は自動的にid2に4が
入るような感じにしたいのですが。。
id1に3を指定してinsertすると、
そのレコードのid2には1が入ると。
イメージを掴めていただけましたでしょうか。。
$id1 を id1 に設定する値とすると、
INSERT INTO table (id1,id2) SELECT $id1,coalesce(max(id2),0)+1 FROM table WHERE id1 = $id1;
こんな感じ?
あ、テーブル作成時か。関数作るしかないか?
118 :
113:03/09/01 12:48 ID:???
>>116 テストで小さいテーブル作ってやってみました。
できました。確かに本当はテーブル作成時に
id2のDEFAULTとして指定できるようにしたいと思ってたんですが、
これでも全然目的は達成できていますので、こうします!
というか、DEFAULTとして指定しないと、
まずselect文を発行してid1におけるid2のmax値を取得して、
その後またinset文を発行することになって、
二度手間になるのかと思ってました。。。
こうやって一緒にできるんですね。
(113に書いた理由で)不本意ながら、勉強します。。。。
ありがとうございました!
不本意でも覚えるとなかなか面白い。ガンガレ
120 :
名無しさん@お腹いっぱい。:03/09/02 12:58 ID:aIhq+MaF
バックアップや分散処理等のためにデータベースを複数箇所に
置いてそれぞれのDBの整合性を取る機能って言えばいいのかな?
122 :
名無しさん@お腹いっぱい。:03/09/03 00:20 ID:MROHIFn2
WEBで会員検索システムを作ってます。会員規模は10万人です。
で、複雑な検索をするのですが、その結果表示が遅いときに、
オペレータの人が「がしがし」ボタンをクリックします。
すると Postgres は律儀に検索しようとして、メモリを使いきり、
スワッピングし続け、HDD回りっぱなしで反応なし状態になります。
こういったことを回避するためのリミッタみたいなものは Postgres にあるでしょうか?
123 :
名無しさん@お腹いっぱい。:03/09/03 06:36 ID:tTNmCqnh
>>122さん
「がしがし」 ←ちょっとワロタ。
Java ScriptやCGIの方でキャンセルさせるべきじゃないかな。
ボタンを無効にしたりとか、「検索中」ページを表示させるとか、
hiddenに前回検索要素を入れて、同一の場合は無視とか。
外してたらスマソ。
124 :
名無しさん@お腹いっぱい。:03/09/03 10:25 ID:POnnpi/I
質問。PostgreSQLでTRANSACTION 処理の隔離レベルの意味を教えてください。
マニュアルを見ると、
>READ COMMITTED … 一つの文はそれが開始される前に"コミット"された行のみ見ることができます。
この文のコミットってどういうことですか?
TRANSACTION処理内では、コミットしないんですよね?
なんでコミットされたっていう言い回しをつかってるんでしょうか?
その時点のトランザクションは自分だけじゃない
READ COMMITTED … 一つの文はそれが開始される前に(他のトランザクションによって)"コミット"された行のみ見ることができます。
なるほど、わかりました。では、例えば、
1. db=# create table a (foo int);
2. db=# insert into a values(1);
3. db=# begin;
4. db=# update a set foo=10;
5. db=# select * from a;
a
---
10
(1 row)
となるのですが、自分のTRANSACTION内でもみかけじょう、
コミットはされているということでなんでいいんでしょうか?
コピペ
SELECT文はこの問い合わせが開始される直前までにコミットされた
データのみであり、コミットされていないデータや、
このトランザクションと同時に実行されてデータが
変更になったものなどは参照しません。
(しかし、コミットされていないものでも、
同じトランザクションで行われた更新の結果は参照します)
COMMIT;
>127
自分自身で更新したものは、当然最新のものが見えます。
でないとロングランなトランザクションなどで困りますし、
そもそもトランザクションてのはそういうものです。
トランザクションの隔離は技術評論社のPostgreSQL全機能リファレンスって本に詳しい。
それ以外にもなにげにマニアックな話題を取り上げているぞ。
>124
シーラカンス本にのってんじゃあねえの。
133 :
名無しさん@お腹いっぱい。:03/09/06 18:39 ID:Rw5afQs3
行数を調べたい場合、普通は select count(*) from foo
とかすると思うんですけど、それだと全行検索するみたいで嫌なのですが、
なんとか安いコストで行数を調べる方法ないでしょうか。
INSERT/DELETEするときに(トリガで)カウンタをいじる。
135 :
名無しさん@お腹いっぱい。:03/09/06 19:25 ID:XXV2gNzR
index張ったってどうせfull scanするだろ?
137 :
名無しさん@お腹いっぱい。:03/09/06 19:55 ID:/Sq1iYcq
138 :
133:03/09/06 20:00 ID:???
システムで行数管理してて、そこを見れたりしないんでしょうか。
PostgreSQL システムカタログ
あたりでぐぐってみれば?
>>139 そりゃアクセスプランを決定するための統計情報だからアテにならん。
その程度の精度で良いんだったら別だが。
実際の話
DBを実装するうえでテーブル上のデータの総数みたいなデータって
どこかに置いておく必要があるんだろうか?
トランザクションとか関わってくると
一意に決まらない情報でしょ
full vacuum直後であれば、pg_classのreltuplesが行数だけど、
その後にinsert/deleteされると実際の値と合わなくなる。
143 :
名無しさん@お腹いっぱい。:03/09/08 17:36 ID:aow70aHR
いま
5 * * * * /usr/bin/vacuumdb -a
6 * * * * /usr/bin/vacuumdb -a -z
とかやってるんですけど、もしかしたら ANALIZE の前って
VACUUM って実行されますか?
144 :
135:03/09/09 16:16 ID:???
>VACUUM ANALYZE は、選択されたテーブルそれぞれに対し、
>VACUUMを行ない、その後、ANALYZE を行ないます。
ttp://www.postgresql.jp/document/pg721doc/reference/sql-vacuum.html >>136 実際に2000行くらいのゴミデータを作って
Explain select count(*) from aaaaa;
を見たらSeq.Scanだった。(恥)
インデックスには、行数の情報も含まれていると思い込んでいたので。。。
PostgreSQL内部に行数のデータを保持するなら、
>>134 に一票。
掲示板とかに「OO件の書き込みがあります」と表示する用途なら、
アプリケーション層にキャッシュする、に一票。
頭から通し番号を付けられるのであれば、インデックスを張って
select max(serial_number) from table; をとる。
で、どうよ?
>>133
↑
max()は結局テーブル全部なめるんじゃない。
count(*)もmax()もどちらも集約関数。
>>144 serialの現在値を取ってくればいいんじゃない?
削除しないことが前提になるけど
>>145 count(*)は全スキャンだろうが、max()ならindexを使って
くれるのが普通じゃないの?
Postgresはどうだか知らんが。
148 :
135:03/09/10 22:44 ID:???
>>146 >>133 が何を作りたいのか不明なのでweb掲示板を想定しているのだが、
途中のデータが削除されることが良くあることですな。
抜け無く、通しで主キーを振るというのは実際はなかなかできませぬ。
個人的にはレプリケーションのとき問題が出るといやなのでserialの代わりに
明示的なトランザクションの中でmax(id)+1をselectして
それを次のデータの主キーにしています。
>>147 その通り。maxがインデックスを使ってくれることを期待してる。
実際は、インデックス付きと無しとでexplainを比べてみねば。
またseq.scanとか出たら恥ずかしい。
135=> create table a( id serial primary key, log text);
NOTICE: CREATE TABLE will create implicit sequence 'a_id_seq' for SERIAL column
'a.id'
NOTICE: CREATE TABLE/PRIMARY KEY will create implicit index 'a_pkey' for table
'a'
(一度抜けてゴミデータを入れる。apacheのエラーログ2000件)
135=>explain select count(*) from a;
NOTICE: QUERY PLAN:
Aggregate (cost=22.50..22.50 rows=1 width=0)
-> Seq Scan on a (cost=0.00..20.00 rows=1000 width=0)
EXPLAIN
135=>explain select max(id) from a;
NOTICE: QUERY PLAN:
Aggregate (cost=22.50..22.50 rows=1 width=4)
-> Seq Scan on a (cost=0.00..20.00 rows=1000 width=4)
EXPLAIN
135=> vacuum analyze a;
VACUUM;
135=> explain select max(id) from a;
NOTICE: QUERY PLAN:
Aggregate (cost=81.44..81.44 rows=1 width=4)
-> Seq Scan on a (cost=0.00..76.15 rows=2115 width=4)
EXPLAIN
135=>
ありゃ?
149 :
133:03/09/11 01:37 ID:???
すみません、
>>133 です。あの、あの時はとても眠かったのであんな質問してしまったのですが、
次の日思い出したら、実は select count(*) from foo; ではなく、
select count(*) from foo where bar = 'buz'; でした。。
これじゃあ全行検索しないといけないですね。。逝ってきます。。
全行とは限らん
151 :
135:03/09/11 17:17 ID:???
>>150 where句である程度絞られる場合は、当然全行なめないはず。
よーし、意地でもindexを使ってやるぞ。
135=> create table foo( t timestamp default now(), bar char(3));
CREATE
135=> create index foo_idx on foo (bar);
CREATE
org021=> select count(*) from foo;
count
-------
62273
(1 row)
135=> select * from foo limit 10;
t | bar
------------------------+-----
2003-09-11 16:48:10+09 | baz
2003-09-11 16:58:46+09 | 515
2003-09-11 16:58:46+09 | 218
2003-09-11 16:58:46+09 | 247
2003-09-11 16:58:46+09 | 128
2003-09-11 16:58:46+09 | 0
2003-09-11 16:58:46+09 | 233
2003-09-11 16:58:46+09 | 233
2003-09-11 16:58:46+09 | 184
2003-09-11 16:58:46+09 | 292
(10 rows)
135=> select count(*) from foo where bar = '233';
count
-------
21
(1 row)
135=> EXPLAIN select count(*) from foo where bar = '233';
NOTICE: QUERY PLAN:
Aggregate (cost=1.01..1.01 rows=1 width=0)
-> Seq Scan on foo (cost=0.00..1.01 rows=1 width=0)
EXPLAIN
135=> vacuum analyze foo;
VACUUM
135=> EXPLAIN select count(*) from foo where bar = '233';
NOTICE: QUERY PLAN:
Aggregate (cost=808.71..808.71 rows=1 width=0)
-> Index Scan using foo_idx on foo (cost=0.00..804.36 rows=1740 width=0)
EXPLAIN
135=>
やった! Index Scan って出た。
しかし、max(bar)ではインデックスを使わないのだろうか。
バブルソートのループ1回分すればいいのなら
インデックスを使うかどうか迷うより速いのだろうか。
VACUUM ANALYZE でやってみてよ
153 :
名無しさん@お腹いっぱい。:03/09/11 19:15 ID:SlxB2PoE
pg_dumpで出力したデータを別マシンのPostgreSQLに移そうとしたら
invalid command \N
と大量に表示されてインポートされません。
7.0.3->7.3.4なので不整合は覚悟していたのですが、何か方法はないでしょうか…
環境はRedhatLinux9+PostgreSQL7.3.4でつ.
>>153 ダンプデータはテキストだから適当に編集すればいいよ。
それが難しければpg_dumpで-d(--inserts)オプションをつけるとか。
データ量多いと遅くて泣けるだろうけど。
どうやって入れようとしたの?
7.0.X から7.3、、問題が出るとは思えないんだが・・・
156 :
153:03/09/11 21:46 ID:???
$ psql -e database < export.dmp
とやっています。
移行元のDBは遠距離にあって他の人に頼んで出力してもらいました。
ダンプデータを開いて\Nを全部消してみましたが、それでもダメぽ…。
Redhat9の環境では7.3以前のPostgreSQLはコンパイルできないし (ノД`)
どうしても無理なら、スクリプトで読んでINSERT文を出力する手もある
158 :
名無しさん@お腹いっぱい。:03/09/12 06:56 ID:Tv4bq9y4
PostgreSQL 7.3.4を使っています。
フィールド名が沢山ありすぎて、selectした時に表示が崩れるのですが、綺麗に表示する方法とかありますか?
表示させたくないフィールドcolumn1, column2,....に次のコマンドを実行すると
次から表示がきれいになるよ。
ALTER TABLE tablename DROP column1, column2,.... CASCADE;
160 :
153:03/09/12 11:36 ID:???
>>154 >>155 >>157 ありがとうございます。
エラーが多くて流れてしまったために気が付かなかったのですが
テーブル生成で失敗していたのが原因で copy from stdin がコケて
しまったようです。
カラムの型定義で
〜 timestamp with time zone DEFAULT 'now'::text
と書いてある「'now'::text」がダメなようで「::text」を外したら問題なかったです。
以前はコレがないとダメだったのでしょうか…
::textがないと'now'をその時点で評価して、インポートした日時が
デフォルトになっちゃう、とかじゃないかねw
>>159 ありがとうございました
表示だけでなく、他のものもすっきりしたような気がします
>>158 この場合
プラズマテレビを買う
が正解
166 :
名無しさん@お腹いっぱい。:03/09/14 10:37 ID:8U60Mzm0
JDBC+javaプログラミング初心者なのですが、
ところでPostgreSQLのjdbcって実装されてないメソッド多くない?
pg72jdbc2.jarとか逆コンパイルして見てみたら
Connection.prepareStatement(String sql, String [] columnNames)
とかないし…。
INSERTした行をどうやって返せというんだ…。
みんなは自前で実装とかしてるの?
俺には
>>166が何を言わんとしているのかが解らん。。。
168 :
名無しさん@お腹いっぱい。:03/09/14 22:05 ID:FTEx2UYb
質問です。
テーブルに keyword,value という属性があって、
keywordをキーとして登録している場合に、
INSERT で keyword と value をセットしていくのですが、
一度テーブルに入れた keyword が来たら、その keyword の
valueの値を更新(value=value+new_valueなど)したいのです。
この場合は、まず SELECT で keyword が存在するか探してから、
INSERT するか UPDATE するか判断するやり方を行ったのですが、
何分データの量が多いので、遅すぎて困っています。
そこで、 INSERTしてから、キーがかち合って失敗したら、
UPDATE を行い、かち合わなかったそのまま何もせず、次のデータを投入、
するやり方に変えましたが、たしかにかち合うデータが少ない場合は、
早いのですが、これではINSERTに失敗するとエラーとなり、
トランザクション処理中だと処理が停止してしまいます。
こういう場合は、どうやれば効率がいいのでしょうか?
教えてください。お願いします。
169 :
135:03/09/14 23:33 ID:???
>>168 value + new_value の+が、算術演算の加算なら、
keyが重複してもかまわずinsertして、
呼び出すときに毎回 select sum(value) from foo_table group by keyword;
>> 152
もしかして私のこと? 何の後VACUUM ANALYZE?
>>168 まず、何件くらいのデータなのか明らかに。
で、データ挿入と検索の比率は?
検索が少ないのなら169の案でもいいと思うが、
普通は"そりゃないよ"と思う。
トランザクションが絡むのかどうか知らんが、
ストアドプロシジャでロジックを組むと多少速くなるかも。
とにかく質問の背景をはっきりさせないとアドバイスできない。
171 :
168:03/09/15 00:13 ID:/fwmc9rM
はい、
INSERT するデータは1回目は100〜300万件程度で、
キーが重なる確率はおよそ5%以下で、
2回目は50〜150万程度で、こちらはたぶん3分の2が重なりそうです。
ということは、
1回目はキーをドロップして、片っ端から INSERTした後に、キーをつけ直し、
2回目はSELECTして見つかったらUPDATEし、見つからなければINSERT
という方法がよいのでしょうか?
トランザクション内だと、少しでもエラーだすと停止しちゃうんですよね。
エラー出しても停止しなければ、楽なのですが。
172 :
169:03/09/15 01:09 ID:???
ん?
2回あわせて最大450万件をinsertした後は、
データは増えず、selectのみということですか。
>1回目はキーをドロップして、片っ端から INSERTした後に、キーをつけ直し
後からキーをどうやってつけるのだ。
>>171 俺ならデータのままスクリプトプログラムかなんかで処理する。
csvかなんかだったらsortかまして
重複部分は事前に値を足した上で、
最後に一括してDBにINSERT文のバッチ処理。
もしくは、
やはり生データをsortして問題を小さく分割してDB処理を行う。
例えばKeywordの[A-D]*、[E-M]*、...、[q-z]*
とソート後のデータを分割して、それぞれDBで処理する。
詳しくは言えないが俺も500万件強のデータに対して
似たような処理をしたことがあるが、
こういう場合は分割統治法のバリエーションで対処するのは基本。
とにかく、日常的にデータ挿入とデータ検索を行うのか、
それともデータ投入時に一度(2度?)だけ行う処理なのかで、
まったく対処が違うのでそこのところは最初にかかないといけないね。
今回は後者の簡単なほうだったのでよかったが。
174 :
168:03/09/15 02:13 ID:???
ええっと、まだDB自体触り初めて間がないのですが、
ALTERコマンドでプライマリーキーをDROPして、
データを一括でインサートしたあと、
再びALTERコマンドでプライマリーキーをADDしようと思ったんですが。
175 :
168:03/09/15 02:24 ID:???
データ投入には、2,3時間、
データ閲覧時はCGIなので、長くて2,3秒で行いたいのですが、
無理でしょうか?
また、keywordは実は複数もってまして、
INSERT時にも、UPDATE時にも、WHEREで複数の条件
で絞り込まないといけないんです。
あぼーん
で、それを1トランザクションにしなければならないのか?
トリガ使えば? INSETUP OR UPDATE で...
か、173の言うようにテキスト処理させるのが楽かな?
キー重複のテキスト処理は良くやる。
これからInsertのキーで、あらかじめDeleteしてから、一括Insertとか。
Updateの切り分けロジックいらねし、まま早い。
今回のような加算ロジックはストアドというよりやっぱトリガっしょ?
ひとまず、打ち込んだcreate table 文か、psql内で \d table_name とやった結果を見せて。
それと、投入するデータの例もいくつか。
180 :
168:03/09/15 12:55 ID:???
そっか、こういうときにトリガってものを使うんですね。
BEFORE INSERT とかすればいいんですね。
いったん別テーブルに丸ごとコピーして、
ALTERでキーを外して、一括インサートした後、ALTERで再びキーを付けて、
VACUUM ANALYZEして、それを元のテーブルにリネームしようとおもってたのですが。
ちなみにテーブルは、
CREATE TABLE(key1 int8,key2 int8,key3 int8,
data_total int8, data1 int8, ... , data100 int8,
PRIMARY KEY(key1,key2,key3));
こんな感じです。
途中で、データ投入プログラムに障害が発生したときのために、
トランザクションでやって、発生したらロールバッグする予定です。
181 :
168:03/09/15 13:11 ID:???
こんなテーブルが4,5種類あります。
INSERTはこんな感じのが100〜300万件
INSERT INTO VALUES (2321,321551,232,576678678,100,23,233,232,..,232);
ちなみに、key1,key2,key3は実は文字列なのですが、新しいキーがでてくるごとに、
別テーブルで、文字列とユニークな数字(シリアル)を振って、
ハッシュみたいな感じにしています。
182 :
168:03/09/15 13:17 ID:???
あ、今気がついたのですが、
トリガを使っても、結局 SELECTしてINSERTかUPDATEか選択する処理を、
DBに毎回やらせることになるので、ストアドでやるのと、
時間はあまりかわりそうにないですね。
やはりキーを外して、一括投入してから同じキーをGROUPBYして、集計して、
キーを付け直して、VACUUM ANALYZEすのがベストなんでしょうか。
>>180 >途中で、データ投入プログラムに障害が発生したときのために、
>トランザクションでやって、発生したらロールバッグする予定です。
障害が発生したらそれ以前に投入したデータもすべてrollback
しなければならない性質のものなのか?これまで挙げられた
状況を見る限りそういうふうには見えないが。
障害が発生した時点で一旦止めて、残りのデータだけを再投入
するんでも良いような気がするが。だいたい、何百万件のバッチを
1トランザクションで投入するなんてあんまり聞かないし。
184 :
168:03/09/15 14:16 ID:???
データ投入時のデータは、一度失敗すると、やりなおしがききません。
やり直ししようと思って、後で途中からはできないんです。
データが、再度やろうとすると、中身が変わってますので。
やるなら、一旦データをファイルに落として保存して、
そのファイルをDBに投入しなければいけません。
なーんか特殊すぎる要件だな。
つまり途中でなにかひとつでもトラブルがあれば投入データ全体が
パーということか。しかも再実行は最初からやり直さなければならない
けれども、その内容が前回と違ってしまうのは許容できると。
数分で終わるjobならともかく、何時間もかかるものだったらオレなら
素直にファイルに落とすけどな。
最後の方をちらっと見ただけですが、
一時的にテンポラリのTABLEを作成し、そこにINSERTしたらどうでしょ
読むときはその一時的なテーブルを考慮しつつ読み出す仕組みを作ればいいし
あとでマージ処理を部分ごとに行うようにするとかもできるし
↑
そうゆうのはよくない。
そうか?
POSシステムで待ちキュー使ったやつが
そんな感じのシステムだが
190 :
名無しさん@お腹いっぱい。:03/09/16 14:42 ID:4ovfBvbl
データ投入時にかなり時間と負荷がかかるが一度きり。
通常は普通の検索を行う。
だから、検索時にテンポラリとかちょっとでも面倒なことは避ける。
検索は普通に行い、データ投入をうまくやることを第一に考える。
だろ。
191 :
名無しさん@お腹いっぱい。:03/09/18 02:06 ID:F8qSF692
ファイルからテーブルへデータを10万件ぐらいインポートしまして、
select uid,sum(file_size) from file_data group by (uid);
このようにすることによって、各ユーザの、所有ファイルサイズが出るようになっているのですが、
だいたい表示まで7〜8秒かかります。
表示を2〜3秒に縮めることは可能でしょうか?
PostgreSQL 7.3.4を使用しています。
>>192 そのままだとどうしても全行参照しないといけないから、
DB環境を向上させるしかないんじゃない?
それかユーザ対ファイルサイズの別テーブルをつくって、
元テーブルの更新のたびにトリガで増減させるか。
193 :
192:03/09/18 02:29 ID:???
194 :
名無しさん@お腹いっぱい。:03/09/18 02:42 ID:F8qSF692
>>192 ありがとうございます。
遊びでやってたら、どっぷりはまってしまいました。
別テーブル作ってやってみようと思います。
195 :
名無しさん@お腹いっぱい。:03/09/18 09:43 ID:s2w5UDM+
ADO.NETでPostgreSQLに接続するときの接続文字列は?
pg_dump実行時に、
pg_dump: handler procedure for procedural language plpgsql not found
というエラーが出てしまいます。
先日までは正常に pg_dump できていたんだけど、50万件ぐらいの
インポートをした後からこんな風になってしまい。
読み書き自体はできているし、psqlで叩くことも出来ているんだけど・・・
どうか知恵を貸してください(_o_)
197 :
名無しさん@お腹いっぱい。:03/09/18 13:47 ID:r7COYCkE
>>195 ODBDかますんなら
Provider=MSDASQL; DSN=PostgreSQL; UID=myid; PWD=myname
直接なら
Provider=PostgreSQL; UID=myid; PWD=myname
データベースの権限に関してハマっています。
名前「aaa」、所有者「aaa」というデータベースを作成し
pg_hba.confでのアクセス項目はcrypt、ユーザ「aaa」と「bbb」の権限はno,noとします。
この状態でユーザー「bbb」がデータベース「aaa」にテーブルを作れてしまうのですが
これを出来なくする事は可能でしょうか?。
関係ありそうなgrant等は調べたのですがダメポな雰囲気が漂ってます。これは仕様なのかな・・・
あぼーん
200 :
名無しさん@お腹いっぱい。:03/09/18 22:38 ID:FHl51+TU
ローカルアプリケーションからリモートのPostgreSQLに
画像を登録したいのですが、ラージオブジェクトを
使う方法でも、rootでなければならない、登録する画像がリモート
ホストにあるファイルしかだめなど、具体的にどのような
手順で行えばよいか分かりません。どなたか
方法をご教授ください。
201 :
名無しさん@お腹いっぱい。:03/09/18 23:00 ID:F8qSF692
double precision 型のデータでどうしても、小数点以下を表示したい場合はどうすればよいでしょうか?
PostgreSQL 7.3.4です。
202 :
名無しさん@お腹いっぱい。:03/09/19 02:02 ID:V6D4fNTS
Linux上にてpostmasterを自動起動させる方法が知りたいのです。
パーペキにFAQだとは思うのですが(^^;、うまく検索することが出来ません。
環境はRedhat7.2+postgreSQL7.2です。initdbまでは流せました。
>>203 中途半端にURLエスケープされてるなw
>>202 PostgreSQLをRPMで入れたんならntsysvかchkconfigコマンド
ソースから自分で/usr/localとかに入れたんなら
>>203
206 :
73:03/09/19 23:01 ID:???
>>203 >>204 >>205 どもでした。chkconfigでイケました。スクリプトも既に用意されていたのでラクチンでした。
……とか思っていたら、7.1→7.2にしたら突然、odbc経由でAccessから覗けなくなりますた(;´∀`)
えと、起動スクリプトに「-i」オプションが付いているのかと思って「postmaster -i -S -D /var/lib/pgsql/data/」と
自分で起動して見ましたが×、pg_hba.confに「host all 192.168.0.100 255.255.255.0 trust」という一文があるのも
確認してあります。この二点のほかにチェックすべき点があればご指摘ください。
>>206 ODBCドライバ最新にする
最新のやつは日本語対応してるので日本語パッチいらないよ
208 :
73:03/09/20 10:44 ID:???
209 :
名無しさん@お腹いっぱい。:03/09/20 22:00 ID:/xl5rns3
基本的なことなのかもしれませんが、教えてください。
例えば、C言語で作ったアプリから、あるDBをオープンするとします。仮にhogeとします。
そして、 PHPからも hogeをオープンして、
Rubyからもオープンしたとします。
同じDBを3つ同時にオープンしに行っても問題ないのでしょうか?
PostgreSQL 7.3.4つかってます。
PostgreSQLに問題はない。
ただし、使う側に問題がある。
セッションとかトランザクションとか勉強してから使ったほうがよい。
>>200 まずは日本語から勉強しなければならないわけだが。
>>208 今の最新は7.03.xxxx
私もそれ使ってたが本体バージョンアップしたら使えなくなって最新にした
213 :
208:03/09/21 16:21 ID:???
>>212 どもでつ……でも、これでもダメでした(T_T)
リンクを一旦切って最初からやり直そうとしても、ODBCドライバ選んだ時点でエラーが出て張りなおせません(T_T)
エラーってどんな?
サーバ側では何も出てないの?
215 :
208:03/09/21 19:35 ID:???
>>214 ODBC-呼び出しが失敗しました。
Could not connect to the server.
Could not connect to remote socket(#101)
>>215 >>206で新しくしたと言っていたが、pg_hba.confがデフォに書き換わったなんて言わないよな?
↑
書き換わったんじゃなくて参照元な。デフォ以外のディレクトリインストールしていると
良くはまるから。
218 :
208:03/09/21 19:55 ID:???
>>216 再度確認しました。ちゃんと「host all 192.168.0.100 255.255.255.0 trust」が入っています。
219 :
208:03/09/21 19:56 ID:???
>>218 ……え?(;´∀`)
pg_hba.conf以外の名前でですか?
とりあえず「find / -name pg_hba.conf」で引っかかるのは一つだけです。
念のため聞くけど、postgresql.conf で tcpip_socket = true にはしてるよね?
221 :
208:03/09/21 21:08 ID:???
>>220 ……ビンゴでした(;´∀`)
すいませんっ、このファイル何ですかっ?!(情け無いことにマジ質問(T_T))
>>221 7.xからある、postmaster へのオプション定義等の設定ファイル
pg_ctl で起動できるようになったための処置、、なのかなあ
実行時に設定できるパラメタのデフォルト値を設定するファイルでもある
psql で SET RESET SHOW コマンドを調べてみるといいかも
(confファイルはRESETで設定される値でもある)
223 :
208:03/09/21 23:38 ID:???
>>222 なるほど。ご丁寧にありがとうございました(拝)
もしかしたら、7.1.xではデフォルトがTrueになっていたんでしょうか?=>問題の箇所
いままで、デフォルトでtcpipがtrueになってたことは無いけどねえ・・・
rpmとかならありうるかも
あと考えられるのは、、、起動オプションが設定を上書きしてたのかもね
rpmでも普通offだわなぁ。
最初っからonなのは見たことないや。
226 :
名無しさん@お腹いっぱい。:03/09/22 17:42 ID:Ex67H8Sv
PostgreSQL 7.3.2 + PHP 4.2.2 でデータベースとその検索サイトを作っています。
検索する時に、1ページに指定した件数表示というようにするには、
SELECT に LIMIT と OFFSET を指定すればとりあえずできるのですが、
さらに全部で何件あるかとか、
各検索結果ページへのリンクとかも表示したいとなると、
やはり、LIMIT, OFFSET なしで SELECT してから
必要な所だけ表示するしかないのでしょうか。
それだと SELECT に時間、メモリをたくさん使うので
もっとスマート方法ありませんでしょうか。
オレは、同じ検索条件で count(*) で数を数え、
LIMIT,OFFSET でページ数調整しながら表示する、というのは
よくやるけど。count(*)もまあ、LIMIT無しといえばそうか
228 :
226:03/09/22 18:11 ID:???
>>227 ありがとうございます。
count(*) でやってみました。
結果が一行一列なので素早くできそうです。ありがとうございました。
一般論として、select count(*)はかなりパフォーマンス悪いんだけど。
ポスグレはどうなのさ?
そりゃ数えるんだからしかたがない。他に手段も無いし
全件SELECTするよりゃまし
231 :
226:03/09/23 19:52 ID:???
実際のデータで select させたら結構遅かったです・・・。
全部 select するよりましなぐらいですね。
232 :
229:03/09/23 19:59 ID:???
いや、全行確実にデータの入っている列(一般にはIDなどのPK列)を
countする方がずっと早いっしょってこと。
それでも遅いようなら、行数を格納するためだけのテーブル一枚
用意することだってある。
(正規化に反するし、不整合が起きないよう気をつけなければならないけど)
count(*)はまず使わない。
数万件程度のデータで、そんなに頻繁に使うことが無い状況だから
count(*)使ってるし、不便無いですね
状況によるってこと。行数を格納するテーブルにトリガ使って
書くほうがパフォーマンスに影響することもあるし
234 :
233:03/09/23 20:45 ID:???
>>232 もちろん、indexやkeyがわかってるんなら、それを指定するんでもかまわん
>行数を格納するためだけのテーブル一枚用意することだってある。
検索条件ごとに変わる数を考えられるパターンすべて保存しておくの?
そりゃすごいね
ちょっと質問
count(*)は慣用句だから変にcount(1)とかするより速いんですよね?
>>232 どういう実装するとそうなるんだろう。
いまいち理屈がわからん。
>>235 大規模なDBで、かつ全件数だけはさっさと出したいという用途で
1行1列(設計者の好みで1行2列のことも)のテーブル設けるんだよ。
で、トリガ使って値を増減させるっちゅー話だろ。
countでは時間が掛かりすぎる場合、たまにそういう設計にする。
もちろん検索条件なんか付けないぞ。普通。
>>236 Oracleなんかでは、count(*)は使うな、極力count(列名)にしろといわれる。
まあ速度差が体感できるほどの件数がなけりゃ同じことだとは思うが・・・
PostgreSQLでどんくらい差が出るのか知りたいところ。
239 :
238:03/09/24 00:32 ID:???
ああ、インデックス使ってもいいけど。
少なくとも、count(*)は避けるようにしている。
バイナリデータの挿入の仕方がマニュアルに書いてない
気がするんですが、どうやるんでしょう。
create table images (imagname text, img bytea);
このimg列に /tmp/hoge.jpg を挿入したいです。
>>241 そこ読んでもサパーリだったんでつ。。
INSERT INTO img VALUES ('myimage','/tmp/hoge.jpg');
みたいにすんなりはいかないんでしょうか。。?
ちとPHPの関数あたってみます。
243 :
名無しさん@お腹いっぱい。:03/09/24 22:02 ID:CYynVP14
postgresって中規模用途だとして、中規模ってどのくらいなのか
数字で教えてホスィ。
テーブル構成やらチューニングやらによるとか
使い方による、という結論になるんでしょうが
どっかにレポートとかないもんでしょうか。
普通にDB設計して仮に会員情報テーブルに100万レコード入れたとして
さほど問題ないパフォーマンス?
それとも10万くらいでOK?2万くらいでキツい?
あーこーゆーこと考えるとOracle・MySQL・DB2とかもどれくらいが許容範囲なのか
気になる。
エロい人教えてくらはい。
244 :
243:03/09/24 22:33 ID:CYynVP14
245 :
243:03/09/24 22:38 ID:???
あー今記事みたら複数サーバにデータ分けて
検索ルーチンを工夫してやってる。
主婦のビックリ倹約アイデアみたいな。
んでも単体DBでの運用実績10万というデータを拾えたんでラッキーか。
>>243 そういうのは第一に要件、そして設計やマシン自体の能力に依存
する部分が大きいからねぇ。10万レコード超えても全然問題ない
という事例があったとしても、
>>243の事例で10万レコード大丈夫か
というのは誰にもわからない。
ちなみにうちでは1テーブル3億レコード超えているけど。
>>244の事例はアプリケーション側で力技のパーティショニングを
実装したということか。なかなか興味深いね。
ガイシュツだったらスマソ
CygwinでPostgresつかってるんですが、最近バージョン上げたら
pg_ctl stopがちゃんと動かなくなった。(killのusageが出る。)
どうもCygwinのkill(/bin/kill, kill(cygwin)1.14)がまずくなったっぽい。
pg_ctlが動かしてる方はこっち。
bash組み込みコマンドのほうのkillならちゃんと殺してくれるっぽいので
pg_ctl頭の#!以下をいじってbash上で動かすようにして応急処置してみた。
これでいいんかな、という疑問は残ったけど。
レンタルDBのデータをバックアップするのに
ダンプがありますがダンプ中のセキュリティとかは
どうなんでしょうか?絶対とはいえなくても安全
なのでしょうか?
他にもいい方法などあればあわせてお願いします
249 :
243:03/09/25 15:51 ID:???
>>246 3億レコードってすごい。
パフォーマンス的には問題なく運用できてるんですよね?
PostgreSQLでの運用実績では賞賛に値する
んではないでしょうか。
よろしければ設計・運用で気配りした点など教えていただけないでしょうか。
>>248 セキュリティとはなんぞや?
そもそも、何がどうなることを心配しているの?
251 :
246:03/09/26 00:43 ID:???
>>249 そこはそれ、要件しだいということで。うちの場合は最終結果が
それなりの量がある場合は検索に1分くらいかかっても許容範囲
だったりするし、同時アクセスもそんなに多くないから。
あとはごく普通に、メモリはめいっぱい割り当てる、きちんと
インデクスが使われるよう確認する、アナライズは定期的に行う、
などさえ注意しておけば。
252 :
248:03/09/26 14:29 ID:???
>>250 DBからローカルにダンプする際に
第三者にデータをスキミングされる心配はないの?
254 :
243:03/09/26 21:47 ID:???
>>251 なるほど。情報提供感謝です。
251さんDBの場合は
検索式が大量にHITする場合はしょうがないとして、
3億レコードから適当な検索SQL文で10件ぐらいを
HITさせる、という場合でも一分ほどかかりますか?
>>252 うんまあでもそういうのってポスグレならではっつーもんでもなかろ。
pg_dumpはDBの中身が平文で標準出力に出るわけだから、
標準入出力が盗聴可能ならごっそり持っていかれるわな。
ファイルにリダイレクトする場合は、パーミッションを気にしなきゃならん
というあまりに当然な話もある。
ダンプしたファイルをネットワーク越しにやりとりするなら
sshトンネリングしたFTPかscpを使うだろうし。
結局、UNIXオペレーション一般で気を使うべきところに
気を使うしかないんじゃないの?
ポート5432経由でDB叩いてるときは・・・何が流れているんだろうねぇ。
誰かキャプチャしてみたことない?
257 :
248:03/09/27 14:33 ID:???
カキコありがとうございます
やはりそうなんですか…
telnetとかssh使えない鯖だと困りますね…
他にはアイデア何か無いですかねー?
鯖変えた方がいいのかな…
ローカルなら通信の盗聴は気にしないでいいんじゃ?
rootはしょうがないが
259 :
名無しさん@お腹いっぱい。:03/09/27 23:00 ID:YVKPHFfz
PostgreSQLが使える無料のレンタルサーバってxrea意外に無いのかなあ。
>>257 シェルがつかえないようなのでネットワーク上暗号化するなら…
a. PerlのCGIかなんかでpg_dumpの出力を暗号化してファイルに保存するかメール送信。暗号化モジュールはCPANにいくつかある。
b. 同じくCGIかPHPなどでpg_dumpの出力をhttpsで転送する。もちろん転送先にWebサーバが必要。
261 :
248:03/09/28 13:43 ID:???
>>260 ありがとうございまーす。a.で検討してみまーす
262 :
名無しさん@お腹いっぱい。:03/09/30 21:06 ID:1ZGrk1y4
質問です。PostgreSQL 7.3.4 において、
CREATE TABLE foo (a int4, b int 4, primary key(a));
で作ったテーブルを、
ALTER TABLE foo RENAME TO bar;
ALTER TABLE foo_pkey RENAME TO bar_pkey;
で 名前を変えました。
db=# \d bar
:
Indexes: bar_pkey primary key btree (a)
その後、ダンプして、次のように DB を作り直してリストアを行いました。
% pg_dump > backup
% dropdb db ; createdb db
% cat backup | psql -f - db
db=# \d bar
:
Indexes: foo_pkey primary key btree (a)
なぜか、indexが変更前の名前のままでした。
pg_dump の時点で古い名前が出力されています。
これは何故でしょうか?バグなんでしょうか?
それとも、indexの名前変更に特別の手段が必要なのでしょうか?
教えてください。
あぼーん
>>262 primary key の名が、TABLE名_pkey と決まってるわけじゃない
作成時にそういう名前で作って定義してるだけ
この場合、primary key は消して再定義して作ったほうがよさげ
消すのも新たにkeyを設定するのもALTER TABLEでできる
なるほど。
先ほど色々調べていたんですが、
PostgreSQL 7.2.x から primary key を後から付けることが
できるようになってたんですね。
一旦、ALTER TABLE で DROP して、再度 ADD するんですね。
となると、名前を変えるだけなのに、
再び VACUUM ANALYZE もしないといけないんでしょうか。
indexの名前を RENAME TO しても、ダンプしなければ、
ふつうに名前が変わっているようにみえるのですが…。
もちろん、普通に新しい名前でアクセスできますし。
今、上司から、
「postgresql.confのパラメータの意味を全て洗い出しといて」
といわれましたが、ググってみましたが、見つかりませんでした。
postgresql.confの内容の説明が載っているサイトがあれば、教えていただけませんでしょうか?
よろしくお願いいたします。
>>266 マニュアルみればいいじゃん。
上司もばか。
>>267 放っておけばいいのに。
優しい奴め(w
一部のパラメータの「意味」はソース読まないとわかんないよ。
270 :
名無しさん@お腹いっぱい。:03/10/03 01:58 ID:cPpR/REg
すでに行ロックされている時に select for update
で待ちたくないのですが、何か方法はありますか?
271 :
名無しさん@お腹いっぱい。:03/10/03 09:35 ID:wUcJkeJo
>>270 for update nowait にして、即例外を投げてもらうようにしたら?
>>271 手元の7.3.2にはなさそうです < nowait
274 :
271:03/10/03 17:25 ID:???
知らん <--無責任なw
 ̄ ̄ ̄ ̄-----________ \ | / -- ̄
--------------------------------- 。←
>>271 _______----------- ̄ ̄ ̄ ̄ ̄
∧ ∧ / / | \ イ
( ) / ./ | \ /
_ / )/ / | /|
ぅ/ / // / | / |
ノ ,/ /' / |│ /|
_____ ,./ // | / .─┼─ |
(_____二二二二) ノ ( (. | / ┼┐─┼─
^^^' ヽ, | | / .││ .│
バージョンが0.1上がるごとにどかっと仕様変えるのなんとかして・・・
>>270 キャンセルすることはできたと思う。
開発者マニュアル読みあさってみれば?
>>271 nowaitはできないよ。
278 :
名無しさん@お腹いっぱい。:03/10/05 15:32 ID:WMw5Qpzo
>277
レスおせーよ
あぼーん
pg_dump -Fc でダンプしたファイルを pg_restore -t table で特定のテーブルだけを
リストアするとprimary keyとかindexが復元されないのですが、これって仕様ですか?
多分-tはテーブルだけ。
インデックスは-iでリストアする。
>>277 nowaitの実装は、WebDBの最新号に、かいてあったけど、
ソース変更しないとだめ。
自分は発行したsql文をある時間でキャンセルすることで対応した。
283 :
TREK 5500:03/10/12 05:48 ID:fX3MaFhg
初心者ですけど、教えてください。
ALTER TABLE で、項目を追加したりすると、
マイクロソフトACCESS(2000)からODBC経由でテーブルを参照できなくなってしまいます。
そういうものなのでしょうか?
>>283 そういうものではないです。
テーブルのリンクをやりなおしてみてください。
285 :
TREK 5500:03/10/12 14:08 ID:fX3MaFhg
それでもだめでした。
286 :
NAME IS NULL:03/10/13 23:38 ID:J6F486gI
SQLで分からない事があり、
どなたかご教授お願いできませんでしょうか?
環境はPostgreSQL 7.3.3です。
下記のようなテーブルがあり、
CREATE TABLE user_master(
regist_time timestamp(0) without time zone NOT NULL,
id CHAR(8) ,
name VARCHAR(25) ,
mail VARCHAR(50) ,
sex CHAR(1)
);
-------------------------------------------------------------
regist_time | id | name | mail | sex |
2003-10-12 03:57:00 | 111 | tanaka | tanaka@***.jp | m |
-------------------------------------------------------------
※ 性別(sex)は、男:m、女,wとなっております。
上記のテーブルを元に
-----------------------------
regist_time | 男 | 女 |
2003-10-12 | 20 | 10 |
2003-10-11 | 18 | 8 |
-----------------------------
日付別で男女別ユーザーの数をだしたいのですが、
どうSQLを書いていいものかわからず質問させていただきました。
SELECT case when nullvalue(men_count.regist_time::date) then women_count.regist_time::date else men_count.regist_time::date end,
case when nullvalue(men) then 0 else men end,
case when nullvalue(women) then 0 else women end
FROM
( SELECT regist_time::date,count(sex) as men
FROM user_master
WHERE sex='m'
AND regist_time::date IN (SELECT regist_time::date FROM user_master GROUP by regist_time::date)
GROUP BY regist_time::date
) AS men_count
right join
( SELECT regist_time::date,count(sex) as women
FROM user_master
WHERE sex='w'
AND regist_time::date IN (SELECT regist_time::date FROM user_master GROUP by regist_time::date)
GROUP BY regist_time::date
) AS women_count
on men_count.regist_time::date = women_count.regist_time::date;
もうダメ。オラにはこれが限界。
regist_time | id | name | mail | sex
---------------------+----------+------+------+-----
2003-10-13 23:59:06 | 00000001 | 1 | | m
2003-10-13 23:59:14 | 00000002 | 2 | | w
2003-10-13 23:59:18 | 00000003 | 3 | | w
2003-10-13 00:00:00 | 00000004 | 4 | | w
2003-10-13 00:00:00 | 00000005 | 5 | | m
2003-10-13 00:00:00 | 00000005 | 6 | | m
2003-10-14 00:00:00 | 00000007 | 7 | | w
2003-10-14 00:00:00 | 00000008 | 8 | | w
2003-10-14 00:00:00 | 00000009 | 9 | | w
2003-10-14 00:00:00 | 00000010 | 10 | | m
2003-10-15 00:00:00 | 00000011 | 11 | | w
(11 rows)
SQL実行すると、
regist_time | men | women
-------------+-----+-------
2003-10-13 | 3 | 3
2003-10-14 | 1 | 3
2003-10-15 | 0 | 1
(3 rows)
left outer joinとright outer joinを同時に実行する方法ってないの?
289 :
:03/10/14 00:58 ID:c61+ht2N
union使ったほうがよさげ。(ぼそ
あ、full join ていうのがあったのでつか。。
いや、outer join使ったの初めてだったので。。
>288のright joinをfull joinに変えればできました。
パフォーマンスは知らんけど。
>290
unionってどう使うのー? おせーてー。
その単語、今回チラッと知ったんだけど、使い方まで分からんかった。。
select date,sum(men),sum(women)
from
(select regist_time::date as date,count(*) as men,0 as women
from user_master where sex='m' GROUP by regist_time::date
union
select regist_time::date,0,count(*)
from user_master where sex='w' GROUP by regist_time::date) as cnt
group by date;
暇つぶしに作ってみたっす。
要件に合ってるかも不明だし、
>>287のSQLも良く見てないです(w
パフォーマンスが変わんないなら、短い方がよいからね。
おー、unionってこう使うのか。勉強になるっす。
PostgreSQL固有でないSQLレベルの話は
よそでやってくれって言おうと思ったら、
SQL専門のまともなスレって無いのね..
はじめまして。
今、テーブル作成を行っているのですが、
CREATE TABLE CUSTOMER_LOGS(
CUSTOMER_ID VARCHAR(32) NOT NULL,
DESCRIPTION VARCHAR(255),
ACTION_USER VARCHAR(32),
ACTION_DATE TIMSTAMP(8) NOT NULL
);
で実行したところ、
ERROR: parser: parse error at or near "("
ERROR: parser: parse error at or near "("
と2行エラーメッセージが帰ってきます。
何が原因なのでしょうか?
> TIMSTAMP(8)
「おれたちTIM」
>>297 が!
構文ミスでしたか・・・
アリガトウございました・
>>296 気になったのだが、IDをVARCHAR型にするの?
INTなりの数字型にしてindexをつけないと重くなるような気がするけど。
301 :
:03/10/14 17:31 ID:CXFd3VN7
postgres って、接続してきたユーザを IDENT 認証しようとしてきたとき、
そのユーザが UID=0 つまり root だったら無条件で接続拒否します?
303 :
:03/10/16 09:31 ID:VFGmw4+V
みんな、ログは syslog 経由?
syslog 経由にする利点って何?
最近面倒なんで、件数少ないのは全部 TEXT にしてるけど
どこかに VARCHAR とのベンチ比較とか無いですかねぇ
PostgreSQL と通信するのに、ODBC とLibpq.dll つかったりしてるけど、
他になんかある?
JDBC
307 :
:03/10/16 21:05 ID:VFGmw4+V
7.3 には ALTER DATABASE name RENAME newname
が無いんですが、どうやってデータベースの名前を変更するのでしょうか?
308 :
:03/10/16 21:17 ID:VFGmw4+V
7.4beta4 のドキュメントでは
ALTER DATABASE name RENAME TO newname
があるそうです。
309 :
:03/10/16 21:41 ID:VFGmw4+V
310 :
一時的にリードオンリーに:03/10/16 21:59 ID:VFGmw4+V
一時的に特定のデータベースへのアクセスを
リードオンリーに制限するにはどうすればいいのでしょうか?
やはり GRANT で全ユーザ、全テーブルの権限を
書き換えなくてはならないのでしょうか?
311 :
psql コマンドで自分が誰かを表示:03/10/16 22:16 ID:VFGmw4+V
psql コマンドで PostgreSQL に接続しているとき、
自分がなんと言うユーザとして接続しているかわからなくなることがあるのですが、
who am i のようなコマンドはあるのでしょうか?
312 :
psql コマンドで自分が誰かを表示:03/10/16 22:23 ID:VFGmw4+V
とりあえず show all; でいろいろ見られるかなと思ったんですが、
現在接続しているユーザの名前は見れませんでした。
select getpgusername();
314 :
psql コマンドで自分が誰かを表示:03/10/16 22:41 ID:VFGmw4+V
>>313 ありがとうございます。
SELECT CURRENT_USER; でもなにやら表示されるっぽいですが、
これって何かしら内部的に使われているテーブルから SELECT しているんでしょうか?
FROM が省略されているのでしょうか?
315 :
Omitted FROM Caluses:03/10/16 22:53 ID:VFGmw4+V
Omitted FROM Clauses
PostgreSQL allows one to omit the FROM clause. It has a straightforward use to compute the results of simple expressions:
SELECT 2+2;
?column?
----------
4
つーことは、CURRENT_USER ってのはタダの内部変数で、
つまりタダの「式」 ってこと?
>>311 \set PROMPT1 '%n@%/%R%# '
とかどうよ?
気にいったら.psqlrcに書いておくと良い。
というかこれで現在のsearch path(schema)も表示させたいんだけどなー。
今は無理みたい。commandとして入れればいいのかなぁ。
とついでに質問してみたり。
>314
getpgusername()がCURRENT_USERを返してると思われ。
318 :
Omitted FROM Caluses:03/10/16 23:22 ID:VFGmw4+V
>>316 ほほう、PROMPT1 なんていうものもあるんですね、勉強になります。
(単にマニュアルを読みこんでないだけという話もありますが)
>>317 そのあたりの関数などの一覧も、まだちゃんとチェックしていないので、
これから勉強したいと思います。ありがとうございました。
あと、
>>310 ですが、pg_hba.conf で禁止することにしました。
319 :
NAME IS NULL:03/10/16 23:23 ID:VFGmw4+V
なんで接続を禁止したかったかというと、
安心してデータベースのメンテナンスをしたかったから、ということなんですが、
僕みたいに個人の Web サイトのバックエンドにしている人ならまだしも
仕事で使っていて PostgreSQL をむやみに停止できない人は困るんでしょうね…
仕事でPostgreSQLを使うことになって調べているのですが、
PostgreSQLって画像を格納することができるんでしょうか?
ご存知の方教えてください。。。
321 :
:03/10/20 15:12 ID:0xhXC68G
>>320 私だったら、ラージオブジェクト使うか、
base64 でテキスト化して扱う。
コンテンツのバックエンドの場合は、ファイルで持っておいたほうがいいという結論になるわけだが。
中身を舐める必要のないデータをDBMSに入れる必要はない。
メタデータだけ入れておけばいいんじゃない?
バックアップとか、元データと寿命を同期させることを考えると、入れておいたほうがいいこともある。
325 :
:03/10/20 18:06 ID:0xhXC68G
>>320-324 という議論がいろんなところでされてたなあ。
あとはケースバイケースでしょ。
僕が聞いたのは画像を扱えるかどうかだけです。
余計な話は結構です。。。
328 :
NAME IS NULL:03/10/20 20:01 ID:cUZE6nZ9
PostgreSQL に MS Access とかで扱っている OLE Object を突っ込みたいって言われたんだけど、
できるんだろうか…もしできなければ MS SQL Server にしなきゃならん…
329 :
NAME IS NULL:03/10/20 20:02 ID:cUZE6nZ9
>>327 まぁそういわずに。ゆっくりしていってくださいね。
330 :
320:03/10/20 20:03 ID:???
>321-326
アドバイスありがとうございました。
私の方ではファイル名だけをDBに入れるつもりでいたのが
「画像も入れよ」との上司命令を賜って迷っていたんですが、
やっぱり画像を入れるのはやめにします。。
331 :
NAME IS NULL:03/10/20 20:07 ID:cUZE6nZ9
>>330 データをファイルとして別に持つときには、
MD5 ハッシュも一緒に持っておくといいと思います。
>>331 そだね。後ファイルサイズとかmime typeとか持ってると、楽なことが多い。
メリットは運用で手抜きできるってことかな。
それ以上のことはないと思うけど、運用で手抜きできるのは、
運用にあまり人を割けない組織ではかなりありがたい。
334 :
333:03/10/20 21:22 ID:???
>>333 あ、間違った。
>>331は別で持つ場合のことを言っているのね。
俺は一緒に持つ場合の意見でした。
すみません。
335 :
NAME IS NULL:03/10/20 21:37 ID:cUZE6nZ9
>>332 なるほど、情報ありがとうございます。
いままで PostgreSQL でバイナリデータを扱ったことが無かったんですが、
SQL 文を発行する際にはバイナリデータは何らかの方法でエンコードされるんでしょうか?
336 :
NAME IS NULL:03/10/20 21:43 ID:cUZE6nZ9
337 :
NAME IS NULL:03/10/20 21:45 ID:cUZE6nZ9
UPDATE t_sample2 SET t_sample2.部門cd = t_sample1.部門cd
FROM t_sample1
WHERE t_sample2.code = t_sample1.code;
t_sample2テーブルのcode っていうフィールドを、t_sample1 のcode
テーブルの内容に更新するという処理だけど、これ実行したら 3,794,550行
の更新に7.6時間かかった。
実行環境は Pen3-800MHz ,1024MB ,
Debian 3.0 ,PostgreSQL 7.2.1 ,GCC 2.95.4
こんなに時間かかるもんなのか、と聞いてるんでない?
知らんけど。あと日本語とSQL文も少しずつ違う気がする。
秒あたり140件が速いか遅いのかはわからない。
トランザクション切ってるかどうかにもよるし。
案外、updateワンセットよりも、insertツーセット(うち1回は
テーブル作成と同時)の方が早く終わるかもよ。
CREATE TEMP TABLE t_temp
AS SELECT t_sample1.部門cd, t_sample2の残りのフィールド
FROM t_sample1, t_sample2
WHERE t_sample1.code = 1_sample2.code;
TRUNCATE TABLE t_sample2;
INSERT INTO t_sample2 SELECT * FROM t_temp;
実行してないから内容は保証しません。
もちろん、実行中はどのテーブルも他所からはuntouchableです。
341 :
NAME IS NULL:03/10/21 12:13 ID:/vGrIqy+
>>[pgsql-jp: 31237] Akira Atsumi
儲からないなら、無償で公開した方がスマートって自己中心な願望に過ぎないYO!
単にオープンソースで無償にしか目が行かずにポスグレで稼ごうと企んで、全銀協から金払って買えないようなヘボヘボビジネスやってる貧乏企業なんだろうけど(w
342 :
NAME IS NULL:03/10/21 12:34 ID:Dy5xJv2p
343 :
338:03/10/21 21:47 ID:???
>>339,340
すまそ、主題を忘れてた。
ようは、こんな環境でこんな処理を実行したら、こんなに時間が
かかったってダケです(^^;;
>340
こんどそれやってみます〜
344 :
NAME IS NULL:03/10/22 11:22 ID:zOSB2GEx
PostgreSQL って、Access のテーブルと同期させることが出来るんでしょうか?
メインのデータがサーバに入ってて、
外回りの人のノートパソコンの Access のテーブルと時々同期させたいんです。
345 :
NAME IS NULL:03/10/22 11:26 ID:zOSB2GEx
346 :
NAME IS NULL:03/10/24 11:54 ID:ESRhBeXa
PostgreSQL の Windows 用 ODBC ドライバが
HTTP プロトコルでダウンロードできるところ知りませんか?
日本語版じゃなくて本家のやつ。MSI のパッケージ。
あ、おれもpostgresqlx.x.x.tar.gzがhttpでダウンロードできるところ、知りたい。
349 :
NAME IS NULL:03/10/24 12:02 ID:ESRhBeXa
>>347 Access アプリといっしょに社員さんに渡さないといけないんだけど、
インストーラつきじゃないとインストールしてもらえそうにないから。
350 :
みつけた:03/10/24 12:08 ID:ESRhBeXa
351 :
みつけた:03/10/24 12:21 ID:ESRhBeXa
>>197 > ODBDかますんなら
> Provider=MSDASQL; DSN=PostgreSQL; UID=myid; PWD=myname
> 直接なら
> Provider=PostgreSQL; UID=myid; PWD=myname
後者の方では、サーバはどこで指定するんでしょうか?
[pgsql-jp: 31306]
こういうメールも久しぶりにみるな。
353 :
NAME IS NULL:03/10/26 16:01 ID:QzGBD7qq
354 :
NAME IS NULL:03/10/26 16:02 ID:QzGBD7qq
355 :
NAME IS NULL:03/10/26 16:03 ID:QzGBD7qq
356 :
NAME IS NULL:03/10/27 15:10 ID:ppzoizRm
MS Access 2000 で PostgreSQL のデータベースに接続して、
グラフィカルに、なすがままに、GUIで、テーブルを作りまくるにはどうすればいいのでしょうか?
ADP で何とかなるんでしょうか?
その際、やっぱり ODBC 経由ですか?
それとも PostgreSQL 専用の OLE DB データプロバイダがあるのでしょうか?
357 :
NAME IS NULL:03/10/27 15:13 ID:ppzoizRm
>>356 MS Access 2000 の ADP (Access Database Project) で接続できるのは
MS SQL Server だけのようなので、断念しました…
358 :
NAME IS NULL:03/10/27 15:19 ID:ppzoizRm
>>351 OLE DB データプロバイダとして PostgreSQL を指定するといいみたい。
自分で試したわけではないけど。
string connectionString =
"Provider=PostgreSQL;" +
"Addr=127.0.0.1;" +
"Database=test;" +
"User ID=postgres;" +
"Password=fun2db";
http://www.go-mono.com/oledb.html
359 :
NAME IS NULL:03/10/27 15:26 ID:ppzoizRm
360 :
NAME IS NULL:03/10/27 15:28 ID:ppzoizRm
361 :
NAME IS NULL:03/10/27 15:29 ID:ppzoizRm
確かに
>>358 も go-mono.com だし…
OLE DB 用のネイティブなドライバはないのかも。
362 :
NAME IS NULL:03/10/27 15:35 ID:ppzoizRm
363 :
NAME IS NULL:03/10/28 12:05 ID:aMgZya+1
HTTP Proxy しか外部との接続手段がない場合、
もはや外部の PostgreSQL を利用するには
その鯖で Apache でも立てて CGI で Web インターフェイスをつけるくらいしかないのでしょうか?
httptunnel
ただし、何のためのfirewallが存在してるのか考えてからな。
管理者に頼んで SOCKS 開けてもらうという手もあるんだけど、
psql なんかも対応してないしなぁ…
SSH が使えるように頼むほうがセキュリティ的には安心だなぁ。
timestamp型のカラムなんですが、INSERT文のときエポック秒のままでは扱えない
のでしょうか?
いつも書式変換してINSERT文に入れてますが、どうもこの処理が無駄に思えます。
こんにちは。
突然ですがlibpqの使い方を勉強してます。
で、下のコードをGCCでコンパイルすると
PQ〜のリファレンスがわかんな〜いって返ってきます・・・
どうしてですか??
わかる人おせーてください。
*
* testlibpq.c
*
* PostgreSQL のフロントエンドライブラリである libpq の
* C 版のテスト
*/
#include <stdio.h>
#include <libpq-fe.h>
void
exit_nicely(PGconn *conn)
{
PQfinish(conn);
exit(1);
}
main()
{
char *pghost,
*pgport,
*pgoptions,
*pgtty;
char *dbName;
int nFields;
int i,
j;
/* FILE *debug; */
PGconn *conn;
PGresult *res;
/*
* バックエンドとの接続に必要なパラメータをセットしてプログラムを開始します。
* パラメータが NULL であれば、環境変数を探して妥当と思われる値を
* 使おうとしますが、見つからない場合は、システムデフォルトの定数を使います。
*/
pghost = NULL; /* バックエンドサーバのホスト名 */
pgport = NULL; /* バックエンドサーバのポート番号 */
pgoptions = NULL; /* バックエンドサーバの起動オプション */
pgtty = NULL; /* バックエンドのデバッグ用 tty */
dbName = "template1";
/* データベースに接続します */
conn = PQsetdb(pghost, pgport, pgoptions, pgtty, dbName);
/*
* バックエンドとの接続が成功したことを確認
*/
if (PQstatus(conn) == CONNECTION_BAD)
{
fprintf(stderr, "Connection to database '%s' failed.\n", dbName);
fprintf(stderr, "%s", PQerrorMessage(conn));
exit_nicely(conn);
}
/* debug = fopen("/tmp/trace.out","w"); */
/* PQtrace(conn, debug); */
/* トランザクションブロックの開始 */
res = PQexec(conn, "BEGIN");
if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)
{
fprintf(stderr, "BEGIN command failed\n");
PQclear(res);
exit_nicely(conn);
}
/*
* メモリリークを防ぐため、必要がなくなったら、すぐに
* PQclear(PGresult) しましょう
*/
PQclear(res);
/*
* データベースのシステムカタログ、pg_database からインスタンスを
* 取り出す
*/
res = PQexec(conn, "DECLARE mycursor CURSOR FOR SELECT * FROM pg_database");
if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)
{
fprintf(stderr, "DECLARE CURSOR command failed\n");
PQclear(res);
exit_nicely(conn);
}
PQclear(res);
res = PQexec(conn, "FETCH ALL in mycursor");
if (!res || PQresultStatus(res) != PGRES_TUPLES_OK)
{
fprintf(stderr, "FETCH ALL command didn't return tuples properly\n");
PQclear(res);
exit_nicely(conn);
}
/* まず属性名を表示 */
nFields = PQnfields(res);
for (i = 0; i < nFields; i++)
printf("%-15s", PQfname(res, i));
printf("\n\n");
/* 次にインスタンスを表示 */
for (i = 0; i < PQntuples(res); i++)
{
for (j = 0; j < nFields; j++)
printf("%-15s", PQgetvalue(res, i, j));
printf("\n");
}
PQclear(res);
/* カーソルを閉じる */
res = PQexec(conn, "CLOSE mycursor");
PQclear(res);
/* トランザクションをコミット */
res = PQexec(conn, "COMMIT");
PQclear(res);
/* データベースとの接続を閉じ、後始末 */
PQfinish(conn);
/* fclose(debug); */
return 0;
}
372 :
NAME IS NULL:03/10/29 19:32 ID:QnJL2XQc
gcc -lpq main.c ってすればいいんじゃないの?
漏れの OS (Debian GNU/Linux) では
#include <postgresql/libpq-fe.h> だけど。
373 :
NAME IS NULL:03/10/29 19:40 ID:QnJL2XQc
ちなみにうちの環境ではコンパイルは通りました。
実行してないけどね。
あぼーん
375 :
NAME IS NULL:03/10/30 22:10 ID:sTbt+zO/
正直PostgreSQLのWindows版を待ち続けています。
業務で使うなら石井さんのとこの買っちゃえばいい気がするけど
個人で使うのには抵抗あるしね…
378 :
NAME IS NULL:03/10/31 11:23 ID:s8J5VFuX
>>377 cygwin じゃだめかな。
漏れは psql コマンドは cygwin の奴をつかってるよ。
サーバは別のところの Linux だけど。
postgreSQLのWindows版が無いので仕方なくmySQLを使っております。
380 :
NAME IS NULL:03/10/31 13:30 ID:s8J5VFuX
381 :
NAME IS NULL:03/10/31 13:41 ID:n6ZftDmf
Windowsマシンを端末に、ADO+ODBCを使ってPostgreSQLサーバに
繋いでいたシステムが最近エラーで繋がらなくなってしまいました。
Unexpected protocol character during authentication;
Error while reading from the socket.
ネットワーク管理者もDBサーバ管理者も設定を変えてないと
言っており、また端末側も設定は変えていません。
端末側のODBCドライバにログを出させると、下のような流れで
SOCKET通信レベルでエラーが起こっているようなのですが....
[xxxx]connecting to the server socket...
[xxxx]connection to the server socket succeeded.
[xxxx]sizeof startup packet = 292
[xxxx]sent the authentication block.
[xxxx]sent the authentication block successfully.
[xxxx]gonna do authentication
[xxxx]read -1, global_socket_buffersize=4096
[xxxx]auth got '\0'
[xxxx]CONN ERROR: func=PGAPI_DriverConnect,
desc='Error from CC_Connect', errnum=210,
errmsg='Unexpected protocol character during authentication'
似た事例、発生原因をご存知の方、おられませんか?
382 :
NAME IS NULL:03/10/31 14:41 ID:s8J5VFuX
>>381 PGAPI_DriverConnect でエラーが起こっているのだから、
Winsock 周りの話ではないと思います。
認証に失敗しているのではないですか?
おそらくパスワードのハッシュ方法の違い (DES と MD5) ではないかとおもうのですが。
383 :
NAME IS NULL:03/10/31 14:43 ID:s8J5VFuX
つまり PostgreSQL サーバの設定で、認証方法が変更されているのではないでしょうか?
でも DB の管理者は変更していないといっているんですよね??
384 :
NAME IS NULL:03/10/31 14:47 ID:s8J5VFuX
postgresql.conf でのパスワードの暗号化に関する設定か、
pg_hba.conf の method の指定が適切でないと思います。
ご意見ありがとうございました。
DB管理者にもう一度確認してみます。
386 :
367:03/11/01 12:34 ID:???
誰か答えてちょーだいよ。367だけどさア。。。
388 :
NAME IS NULL:03/11/03 17:07 ID:0aIYxvkt
Microsoft の
ノースウインド.mdb
を勉強の為にPostgresで使いたいのだけど一発でインポートする事なんてできますか?
pgAdminiII
390 :
NAME IS NULL:03/11/04 00:01 ID:HVSpp1ON
PHPで開発しています。auto incriment のフィールドがあって、
insert した時にその insert した行の番号を知りたいです。
どうすればいいのでしょうか?
insertするのと同じトランザクションでselectすりゃいいんじゃないの?
>>390-391 すんまへん自己レスです。
nextval をとって、その値で insert すればよかったです。。
# 最近自己レスが多いなあ。。
>>392 同時書き込みがあったときに保証できるの?
素直にpg_lastoidとって、select
395 :
393:03/11/04 12:25 ID:???
>>394 読み込みようのロックを使うとかの話?
そもそもserialのnextvalを自力でとってinsertしてもインクリメントされんような気がするのだが。
397 :
393:03/11/04 13:42 ID:???
>>396 煽るのはいいけど、インクリメントされるかどうか、書いてもらえるか?
399 :
393:03/11/04 15:21 ID:???
nextvalって値とっただけでインクリメントされるんだな。
トランザクションの理解がどこで必要になるのかはわからなかったけど。
どっちにしろ、serialフィールドならpg_lastoid使うほうがいいと思うが。
400 :
393:03/11/04 15:40 ID:???
pg_getlastoidね。
403 :
NAME IS NULL:03/11/04 19:48 ID:RtJ+FOnV
プライマリキー指定を解除しようと思って
ALTER TABLE test DROP PRIMARY KEY;
としたのですが、
ERROR: parser: parse error at or near "primary" at character 23
と言われてしまいました。間違っているのでしょうか…。
>399
incrementalなserial値とlastoidは全然別の話だと思うが。。。
なぜ誰も突っ込まない?
405 :
NAME IS NULL:03/11/04 22:52 ID:ytHQNcHv
お願いします。
[test1]
name | divno | postno |
------+-------+--------+-
x | | 1 |
y | 1 | |
z | 2 | 2 |
[test2]
divno | divname |
-------+-----------+-
1 | marketing |
2 | sales |
[test3]
postno | postname |
--------+----------+-
1 | syacho |
2 | kacho |
上の様な3つの表があります。
外部結合で以下のようなSQL文をpsqlで発行しました。
select t1.name , t2.divname , t3.postname
from (test1 t1 left join test2 t2 on t1.divno = t2.divno)
left join test3 t3 on t1.postno = t3.postno ;
すると以下のようなメッセージが返されました。
sisdb->
ABORT BEGIN COMMENT ……
ALTER CLOSE COMMIT ……
ANALYZE CLUSTER COPY ……
sisdb-> left join post p on e.postno = p.postno
結果はちゃんと返されるのですが…
これは警告なのでしょうか?
SQL文に何か問題があるのでしょうか?
バージョンはpostgreSQL7.3.4で
redhat9です。
よろひくお願いします。
>>404 lastoidつかってINSERTした列をSELECTするってことじゃ?
407 :
406:03/11/04 23:20 ID:???
列→行
>406
あーそーゆーことか。
いや、serial値なら同一トランザクション内でmax取りゃいいじゃん、と思ってた。
409 :
NAME IS NULL:03/11/06 12:34 ID:C3LKLBj/
root で postmaster を起動しようとすると
"root" execution of the PostgreSQL server is not permitted.
The server must be started under an unprivileged user id to prevent
a possible system security compromise. See the documentation for
more information on how to properly start the server.
といわれて何もしません.
postmaster の権限を調べてみても,
root に実行権限があります.
どうすればいいのかわからなくて途方にくれています.
>>409 書いてある通りだけど、
危険だからrootで実行できないようになってるんでしょ。
ユーザーを作ってそいつに実行させれば解決。
411 :
NAME IS NULL:03/11/06 13:30 ID:C3LKLBj/
>>410 postgres ユーザで実行したら無事動きました.
ありがとうございます.
ついでに質問です.
(1) Unix の起動ファイルに,postgres のサーヴィスが
動くようにするのが普通ですが,これは root が実行する
ものではないのでしょうか?
(2) 今の私のシステムでは root 権限で,
su - postgres
として,PostgreSQL の管理ユーザになれますが,
一般ユーザから su しても,パスワードを求められ,
postgres ユーザになれません.
一般ユーザから postgres ユーザになるには,
どうすればいいのでしょうか?
(1)
それが危険だから、PostgreSQL専用ユーザを作って起動させているのでは?
(2)
ユーザpostgresのパスワードを設定すれば?
やり方は自分で調べてね。
いいこと教えてあげますね
つい先ほどですね、本見て適当にトリガーっつうの入れてたんです
なんか動いてるような気がしなかったから、なんつーかそのー
ばんばん打ち込んだんですね、そしたらですね
先ほどからメインサーバーがですね、落ちたんですね
はい!ですけど、まだ自分が疑われてないので
今から急いで情報調べるんですね。はい
>>411 >一般ユーザから postgres ユーザになるには,
>どうすればいいのでしょうか?
あまりその必要はないと思うのだが・・・
>>411 「起動時 特定ユーザー プロセス 起動」でぐぐれば?
あ、起動がダブった... 首吊ってきまツ
phpPgAdmin に関する質問はここでよいのかな?
>>411 (1)
rootが実行するが、rootが他の人の権限で動かすという格好だ。
su -l postgres -c コマンド名 とでもしているんじゃないだろうかね。
これは「非常に」よく使う方法。
サービスが何でもかんでもroot権限で走るっつーのはあんまり
好ましいことじゃない。
(2)
一般ユーザからpostgresユーザにsuできる可能性はできるだけ摘み取るべき。
ちなみにこれはPostgreSQLの話じゃなくてUNIXのアカウント管理の話に
なるのだけれど、「パスワードが設定されていない」状態には2種類あってね。
「rootからしかsuできない」「誰でもパスワード抜きでsuできる」だ。
通常useraddされたばかりのアカウントはパスワードが
設定されておらず、この状態は前者に相当する。
後者にしたければ/etc/paswdファイルを手でいじるか、passwd -dするか。
まあそんな穴をわざわざ用意する必要はないぞ。
いまどきのUnixだとおもうからsudoつかおうよ。
なんだかそれ以前に、createuser とかしていない感じがする。
-Uオプションを知らないとか。
PgSQLのバックアップ のダンプファイル ****.dump
なんですが、レンタル無料Xrea サーバ内では復元できますが、
その****.dumpをダウンロードしまして、自宅サーバーで
(RHL7.3 PgSQLは同梱包のRPM)で
以下のようにすると
$ pg_restore -d **** ****.dump
pg_restore: [archiver] input file does not appear to be a valid archive
で、復元できません。つまり互換性がなかった。まあ中身はいろいろパスが通っている
-d このオプションも色々かえたり、直接 ****.dump の中を
書き換えたりしても、
pg_restore: [archiver] input file does not appear to be a valid archive
でした。
何かいい方法見つけた方いらしゃいますか?
Xrea サーバでのダンプするときはいろいろパスが通っているようなので
ノーマルのpg_dump -d **** > ****.dump
に戻す何か方法ありませんでしょうか。
>>423 psql **** < ****.dump
少なくともパスは関係ない。
425 :
NAME IS NULL:03/11/07 14:03 ID:A52L86Yg
データベースのコピーはどのようにするのですか?
>>424 ありがとうございます。なるほど、ヒントになりました。
Table全部消してから
psql **** < ****.dump
You are now connected as new user ****.
CREATE
CREATE
CREATE
ERROR: parser: parse error at or near "("
invalid command \.
ERROR: parser: parse error at or near "1"
invalid command \.
ERROR: parser: parse error at or near "2"
invalid command \.
ERROR: parser: parse error at or near "001"
エラーがでましたが
****.dump のエラーを直接書き直してやってみます。
>>426 ダウンロードか編集したときに文字化けしてねーか?
428 :
NAME IS NULL:03/11/07 18:24 ID:1AJ04Jch
Cygwin→ipc-daemon→PostgreSQL7.2.3をWindowsで動かしております
pgAdminiIIでの操作ができたので今度は同じようなものを自分でつくって
見ようかとVS.NETを起動させましてサーバーエクスプローラーというところで
は接続できるようになりました。
手元にあるテキストではOleDbDataAdaputerを使えと書いてあったのでその
ようにODBCからPostgreSQLの日本語ドライバを指定したのですが
作成した接続は現在のアダプタでは使えません
といわれてしまいます。
なにか根本的にやり方を間違えてますか?
429 :
NAME IS NULL:03/11/07 20:17 ID:eFEFRmnp
>>425 pg_dump --blobs --format=c $1 | pg_restore --format=c --dbname=$2
こんな感じでやってる。
>>427 いえ、vi で開いていますが、化けてなく
日本語もきれいです。
431 :
NAME IS NULL:03/11/12 16:25 ID:aQ88b7gt
あるテーブルの列ごと削除するには
どうすればいいですか?
ALTER TABLE .. DROP COLUMN ..
マニュアル嫁 > 431
433 :
ナミ:03/11/12 17:15 ID:aQ88b7gt
コマンドラインから psql を使って,
databasename というデータベースの
tablename というテーブルを
tablename1 という名前で
丸ごとコピーするには?
マニュアル嫁 > aQ88b7gt
436 :
NAME IS NULL:03/11/13 07:28 ID:HSJGrKBs
mySQLでいうところの「phpMyAdmin」みたいに、
ウェブブラウザからpostgresをいじれるツールってないでしょうか?
(WinXPPro-SP1の)MS-ACCESS2003から、
(テーブルのリンクで)レンタル(共有)サーバ上ののpostgresにアクセスしようとすると、
ODBC--呼び出しが失敗しました。
Unknown authentication type (#211)
と怒られてしまいます。
ps -auxしたら、
postmaster -i -S -D /usr/local/pgsql/data (postgres)
とちゃんと「-i」オプションがついてて、
pg_hba.confは、
host all 0.0.0.0 0.0.0.0 trust
と書いてあり、
postgresql.confは、
tcpip_socket = true
にしています。
いったい、何が原因なのでしょうか?
440 :
438:03/11/13 10:12 ID:???
マジレスきぼんぬ
441 :
ナミ:03/11/13 11:20 ID:bLb02GzT
データベースの持ち主を変更するには
どうすればいいんですか?
>>438 ver7.3、それともそれ以下?
調査しますので
IPアドレスかホスト名、ユーザ名、パスワード、
データベース名を教えてください (w
>>438 問題の切り分けのため、
ODBCじゃなくlibpgsql使うフロントエンドで接続したらどうなん?
portがあいてないとかだったら爆笑
>>444 想像だけど
Unknown authentication type (#211)
なので接続はしているのではないかと。
で、認証でコケているように見える。
しかし trust だしなあ
パスワードからにしてる?
447 :
NAME IS NULL:03/11/15 03:16 ID:TwEtqxvX
すみません。いろいろ手を打ったのですがだめだったのでここで聞きます。
CREATE TABLE message (
id int,
type smallint,
message VARCHAR(300),
post_time timestamp without time zone);
CREATE INDEX message_idx1 ON message (post_time);
で作ったテーブル(Rows: 57万件)で
EXPLAIN SELECT id FROM message
WHERE type = 1 and post_time >= now() - interval '48 hours';
とやってもINDEX message_idx1を使ってくれなくてSEQSCANで結果が出るのに
時間がかかってしまいます。
SET ENABLE_SEQSCAN=off;
も
SET EFFECTIVE_CACHE_SIZE=80000;
も
ALTER TABLE message ALTER COLUMN post_time SET STATISTICS 100;
ANALYZE message;
もやったのですが結果が変わりません。
timestamp型だからindexを使ってくれないんでしょうか?
ちなみにバージョンは7.2.1です。
その57万件のうち、type=1が何件かにもよるな。
449 :
447:03/11/15 10:48 ID:???
>>448 typeの値は0か1の2通りなんですがtype=1は49万件あります。
かなり偏ったデータです。
便乗質問だけど、PostgresはINDEXの使い方がヘタ?
>>448のケースだと、どうせインデクス使ってくれない前提で
(id, message)を別テーブルにして
(id, type, post_time) のみのテーブルにした方が
検索パフォーマンス高かったりする?
(ところで id は、PRIMARY KEY にしてもいいよね?)
このスレでも他スレでもさんざん指摘されてたことだけど、
単なるCOUNT(*)で、明らかにインデクス数えた方がいいだろうと
思われるケースでもsequential scanに逝っちゃうからなぁ。
という漏れは無料Sybaseに転びますた。
ちょっと前までのPostgresはオプティマイザの挙動が変なところが
あったのは事実だな。7.3になってけっこうまともになったような記憶が
あるが。
>>447の例は単純すぎるから原因は別だと思うが、特に7.2はできが
悪かった。
>このスレでも他スレでもさんざん指摘されてたことだけど、
>単なるCOUNT(*)で、明らかにインデクス数えた方がいいだろうと
>思われるケースでもsequential scanに逝っちゃうからなぁ。
Postgresでなくても、count(*)を index scan で済ませる実装はあまり
見たことがないが。
COUNT(*)でIndex使ったらそれはそれでアレなような気が。
COUNT(PK列)ならわからんでもないけど
言い忘れ
7.3使ってるけど、PostgreSQLのオプティマイザは
たまにどうしようもなく遅い選択をすると思う。
他のDBMS(OracleやSQL Server)では問題なく
実行速度が出るようなSQL文でも、
PostgreSQLでやると途方もなく時間がかかったり。
ま、SQL文はシンプルに書けということですな。
>>453 経験的に、適当にセッティングしたDB上で、
いいかげんに書いたSQLが一番早く走るのは、
SQL Server , PostgreSQL , Oracle の順だな。
しっかりとチューニングした場合はOracleがだんとつに早くて、
SQL ServerとPostgreSQLは同じくらい。
Oracleはちょっとしたことですぐ御機嫌が悪くなるイメージがある。
PostgreSQLは素直に無難に動く感じ。
いい加減な環境で動かすならSQL Serverが一番だと思う。
インストールも楽だし、運用も楽。
いい加減にやる場合にはね。さすがMS。
Windowsがいい加減な環境だとでもいうのですか?
456 :
447:03/11/16 03:21 ID:???
>>451 一応バージョンアップも考えていたのでテスト環境で7.3入れて試してみます。
今インスト中。あと、7.4RC2もあったのでこいつも試してみます。
>>454 SQL文に限らず、Oracleはしょーもないところでつっかえやすいねぇ。
悩んで悩んで、知ってる人に聞くと「えっ?そんなことだったの?」とか。
あんま細かいこと気にせずに、ぱっぱとやるならSQL Serverか。
プラットフォームが限定されるのをどう捉えるか、だね。
PostgreSQLはちょっとのバージョン違いで挙動がコロコロ変わるのが・・・
進化中なのは構わないけどそろそろ落ち着いてほしい。
458 :
NAME IS NULL:03/11/16 13:21 ID:evY8/QEJ
>>457 物凄く抽象的過ぎてイメージが湧かない。
具体例をそれぞれあげてくれるとありがたい。
459 :
NAME IS NULL:03/11/17 11:21 ID:cPuto3eS
あるデータベースのあるテーブルの属性とその型たちを
チェックするようなシェルスクリプトを書きたいんだけど,
どうすればいいの?
>>459 Perlで書いた方がよいと思われ
どうしてもというならばシェルスクリプトで書くの止めはせんが
で、マジレスなのだが、
pg_*** を片っ端から眺めれば自ずと答えは見えてくるよ。
長い間Postgresの運用から外れてるのでsage
いまさらですが、
J-PHONEのメアド(@jp-x.ne.jp)が
Vodafone(x.vodafone.ne.jp)に変わりましたが、
DBに格納されてるアドの
ホスト名部分だけを一括変換って出来ないでしょうか?
正規表現の前方参照さえ使えれば出来そうですが、無理でしょうか?
>>459 `psql (option) -c "select hogehoge"`とやってやれば、むしろ日常ツールとしてぱっと作るのなら、
コネクションとかの作成をしないですむかららくな気が。
まあ、これはPERLでもできるけど。
んで、テーブルはpg_classに入っていて、relkind がrのもの。
テーブル名はrelname.
データタイプはpg_typeにある。
詳しくはドキュメントの開発者ガイドをどうぞ。
>>461 むりして調べるより、
ぱっとあなたが使える前方参照の正規表現がある言語でアクセスして
アップデートかけてやった方が早いような気もするけどねぇ。
一回しかやらないのでしょ?
#いや、おれもしらないけど。
perlにて
$mail = 'psql -t -c "select mail_address from hogehoge where mail_address like '%@jp-x.ne.jp'";
@mails = split(/\n/,$mail);
for $oldmail (@mails){
$newmail = $oldmail;
$newmail =~s/jp-x\.ne\.jp/x\.vodafone\.ne\.jp/;
`psql -c "update hogehoge set mail_address = $newmail where mail_address = $oldmail`;
}
みたいに
あー、正規表現のスラッシュが消えてる。脳内補完しておいて
`psql -c "update hogehoge set mail_address = '$newmail' where mail_address = '$oldmail'"`;
もうちょっと忘れてた。後、テキスト型だろうから、こうか。
'psql -t -c "select mail_address from hogehoge where mail_address like '%@jp-x.ne.jp'"`;
これも間違ってた。スマソ。
>>463-466 なるほど。
結構件数が多いんでUPDATE一発で出来たら幸せだったんだけど、
無理っぽいですね。PL/pgSQLを組むんだったら負荷的に変わらないし
でもありがとう。そのコード使わせてもらいます。
>>467 ~ で正規表現使って選び出し、substrで切り出してくっつけてUPDATEって
できなくもないが、、失敗するとショックでかいのでスクリプト書いたほうがいいね
469 :
NAME IS NULL:03/11/18 10:02 ID:iZZGOnRs
471 :
NAME IS NULL:03/11/18 13:02 ID:/fCQ8oFr
こんな過疎スレでも、この板では最人気スレ。
寝不足でぼーっとしてて、template1に初期構築用のSQL文流し込んでしまいますた。
DROPして作ればもとにもどってくれるかな?
473 :
NAME IS NULL:03/11/18 16:57 ID:u72w5U2h
create table test(
hoge int4,
fuga int4
);
としてテーブルを作ったとき,
hoge 列と fuga 列がダブることのみ禁止する
# どっちかが異なれば許す
ような制約の設定方法は?
>>469 source/v7.4は全てのdownload用ftpサイトにミラーされていますが
binary/v7.4はまだミラーされてないサイトが多いですね。
日本のftpサイト(ftp.jp.postgresql.org)もbinary/v7.4はまだです。
なおbinaryは今のところbinary/v7.4/suse(SUSE Linux用)しかありません。
Windows用binaryを楽しみにしていますが本当にv7.4から対応するんでしょうか?
7.4.2になるくらいまでは様子見かなぁ・・・
476 :
NAME IS NULL:03/11/18 22:42 ID:JKZi6+sT
7.3 -> 7.4 などに変えるときは、データを一度吐き出してからupgradeするんでしたっけ?
そだな
pg_dumpall > file
・
・
psql template1 <file
5k くらいあるほとんど一意なテキストデータを text カラムに入れています。
= で抽出することがあるので CREATE INDEX しようとしたら
デフォルトの btree は 2733byte までと怒られたので USING HASH にしました。
今のところ INDEX なしと比べて 1/300 の速度で検索できて快適なのですが、マニュアルの
「完全に動的」や「静的 hash」の意味が分からず不安です。
http://www.postgresql.jp/document/pg734doc/user/indexes-types.html 定期的に vacuum full analyze かけているのですが、あるタイミングで
hash が btree になったりすることがあるということでしょうか?
もしくは急にパフォーマンスが悪くなるとか?
ご存知の方、何かアドバイスをいただければと思います。
マニュアル読んでも分からないんですが、バイナリをデータベースに
格納するSQL文を教えて下さい。
テーブル hoge に、bytea型で定義されたphotoという列があります。
ここに /home/mona/photo/mona.jpg を格納したいんです。よろしく
お願いします。
>>479 8進数わかる?
基本的にバイナリもそのまま入れられるが、
一部をエスケープしなければならない(\\に3桁の8進の数字ををつけたもの)
全部エスケープしてもいいので、スクリプトで全部変換してしまうのも手だね
481 :
NAME IS NULL:03/11/20 02:13 ID:7oqjaIhk
7.3.4リリースされました。
ttp://www.postgresql.org/news/160.html 副問い合わせなどの性能向上、IPv6サポートなどがされた
ようです。
喜んでアップグレードしてみたところ
FATAL: database files are incompatible with server
DETAIL: The data directory was initialized by PostgreSQL version 7.3, which is not compatible with this version 7.4.
なんてメッセージが(´・ω・`)ショボーン
482 :
:03/11/20 09:07 ID:T0Vee6QX
>>481 ふつーダンプしてリストアして移行する。
そもそもそんな簡単にバックエンドDBを移行しないよ。
検証してからやるべし。
7.3.4 ってなんだ
7.3.x -> 7.4 かな?
>>480 その説明聞いてもピンと来ないです。
出直してきますね。。
485 :
NAME IS NULL:03/11/21 03:14 ID:DWtGky6Z
7.4 で configure の時に --java オプションつけて、jdbcドライバも一緒に作ろうとしたんですが、
/home/postgres/postgresql-7.4/src/interfaces/jdbc/build.xml:114: Old driver was detected on classpath or in jre/lib/ext, please re
move and try again.
このようなエラーが出てうまくいきません。
7.3.4の時の、jdbcドライバはclasspathから切り離してみたのですが、結果は同じでした。
どのようにしたら、いいでしょうか?
java 1.4.2
Apache Ant version 1.6beta2
kernel 2.4.22
RedHat 9 を使用しています。
486 :
NAME IS NULL:03/11/21 04:19 ID:mYYJI5kx
>>484 INSERT INTO table VALUES ('\\001\002\003・・・\\255')
こんな感じ
printf("\\\\%03o", data); を繰り返せば\\xxx の羅列はできる
488 :
487:03/11/21 11:22 ID:???
あ、、、8進だから最後は、\\377 だったな・・・
489 :
NAME IS NULL:03/11/21 12:53 ID:uP23HR97
DBサーバー: Red Hat Linux 3.2.2-5 , PostgreSQL7.3.4
開発環境1 : VB6(SP5) , ADO2.7SP1Refresh
開発環境2 : VB6(SP5) , ADO2.7SP1Refresh
この環境で FOR UPDATE のついたSELECT文を
実行すると開発環境1では正常に実行できるのですが
開発環境2では次のようなエラーが出てしまいます。
「ODBCドライバは要求されたプロパティをサポートしていません」
ADOのRecordsetをOpenするときにの設定は次の通りです。
RecObj.CursorType = adOpenStatic
RecObj.LockType = adLockReadOnly
開発環境1と2で何が違うか調査しているのですが
なかなか違いがわかりません。
どこが一番怪しいかわかりますか?
よろしくお願いします。
490 :
489:03/11/21 13:23 ID:uP23HR97
自己レスです・・・
読み返してみたら文章変でした。
開発環境1と2はインストールしているソフトは同じにしているつもりなのですが
何かのバージョンや設定が違う可能性があります。
この設定の違いを確認しろ!!というような項目はあるでしょうか?
491 :
NAME IS NULL:03/11/21 19:17 ID:9uyKcBIr
>>486 /usr/local/j2sdk1.4.2/jre/lib/ext
のなかなんですが、postgresql.jar は、引っかからないように、__postgresql.jar__ という名前にリネームしてるんですけど
やっぱり、同じエラーが出てきてしまいます。
492 :
NAME IS NULL:03/11/22 10:47 ID:OD6R5Gpt
493 :
NAME IS NULL:03/11/22 13:23 ID:g+cwdB3d
>>492 postgresql.7.4/src/interface/jdbc のREADMEから抜粋
Once you have ANT, run the configure script in the top-level directory with
the --with-java option. Then proceed with 'make' and 'make install' as
usual. This will compile the correct driver for your JVM, and build a .jar
file (Java ARchive) called postgresql.jar. The file will be installed in
the directory PREFIX/share/java.
That jar file will contain the driver for _your_ version of the JDK.
トップディレクトリで configure --with-java オプションを使用すれば,貴方の環境でantは実行されます。
通常は、make,そして make installを実行してください。
これは、あなたのJVMのための正確なドライバをコンパイルし、postgresql.jarと呼ばれる.jarファイル(ARchiveなJava)を構築するでしょう。
ファイルは、ディレクトリーPREFIX/share/javaにインストールされるでしょう。 < これは、/usr/local/pgsql/share/java になる postgresql.jar だとおもっています。
そのjarファイルは、貴方のバージョンのためのドライバが入っています。
と・・書いてあったので(英語もあんましよくわかってないがこんな感じなんだと思うんですが)、postgresql.jarが、jdbcドライバだと思うんですが、どうなんでしょうか?
もちろん、/share上にある、postgresql.jar も消してためしています。
>286
超遅レスですが、下記のSQL 文はどうでしょう?
もはや手遅れだと思いますが、アンケートの結果集計等で結構使えます。
SELECT TO_CHAR(A.REGIST_TIME,'YYYY/MM/DD') AS REGIST_DATE -- 日付
,SUM(CASE WHEN A.SEX = 'M' THEN 1 ELSE 0 END) AS MALE -- 男
,SUM(CASE WHEN A.SEX = 'M' THEN 0 ELSE 1 END) AS FEMALE -- 女
FROM USER_MASTER A -- ユーザーマスタ
GROUP BY TO_CHAR(A.REGIST_TIME,'YYYY/MM/DD')
また入荷予定表なんかも作れます、下記の様なSQL かな。
'2003/11/23'の日付の文字列をプログラム側で設定したりすればよい。
また横軸を日単位から1時間単位に集約を製品、日時にすると何月何日何時に入荷す
るかがわかるクエリーになるかな。
CREATE TABLE PRODUCT_UKEIRE_INFO( -- 製品受入情報
PRODUCT_NO INTEGER -- 製品番号
,UKEIRE_DATE TIMESTAMP -- 受入日時
,UKEIRE_COUNT INTEGER -- 数量
);
SELECT A.PRODUCT_NO -- 製品番号
,SUM(CASE WHEN TO_CHAR(A.UKEIRE_DATE,'YYYY/MM/DD') = '2003/11/23' THEN A.UKEIRE_COUNT ELSE 0 END) AS DAY1 -- 日
,SUM(CASE WHEN TO_CHAR(A.UKEIRE_DATE,'YYYY/MM/DD') = '2003/11/24' THEN A.UKEIRE_COUNT ELSE 0 END) AS DAY2 -- 月
,SUM(CASE WHEN TO_CHAR(A.UKEIRE_DATE,'YYYY/MM/DD') = '2003/11/25' THEN A.UKEIRE_COUNT ELSE 0 END) AS DAY3 -- 火
,SUM(CASE WHEN TO_CHAR(A.UKEIRE_DATE,'YYYY/MM/DD') = '2003/11/26' THEN A.UKEIRE_COUNT ELSE 0 END) AS DAY4 -- 水
,SUM(CASE WHEN TO_CHAR(A.UKEIRE_DATE,'YYYY/MM/DD') = '2003/11/27' THEN A.UKEIRE_COUNT ELSE 0 END) AS DAY5 -- 木
,SUM(CASE WHEN TO_CHAR(A.UKEIRE_DATE,'YYYY/MM/DD') = '2003/11/28' THEN A.UKEIRE_COUNT ELSE 0 END) AS DAY6 -- 金
,SUM(CASE WHEN TO_CHAR(A.UKEIRE_DATE,'YYYY/MM/DD') = '2003/11/29' THEN A.UKEIRE_COUNT ELSE 0 END) AS DAY6 -- 土
FROM PRODUCT_UKEIRE_INFO A -- 製品受入情報
GROUP BY A.PRODUCT_NO
では血尿も出てきてるので、今日は帰って寝ます。
495 :
NAME IS NULL:03/11/24 15:54 ID:W7Ky1Nr4
SQL中級車です。exceptとnot existsってSQLをネストして使う場合
どっちが早いの?
レッツexplain
explain analyze もいいよ。
>>497の方法は実際に問い合わせが実行されちゃうから注意してね♪
begin; rollback;ではさむとかね。
499 :
NAME IS NULL:03/11/25 13:58 ID:l5fvlImG
質問です。
RedHat9+Postgres7.3.2 で構築中なんですが、サーバを量産しなきゃ
ならんのでできる限りデフォルトで入っている環境をそのままで使いたい
ですよ。ところがデフォルトのデータフォルダがどこかさっぱりで。。。
FreeBSD+Tar玉 とはエラく構成が違うようで悩んでます。
そのあたりをごっそり書いてあるようなサイトってありますか?
500 :
NAME IS NULL:03/11/25 14:14 ID:db7RU1wF
>>499 機器構成が同じなら、バイナリコピーでいいんじゃない?
501 :
499:03/11/25 14:25 ID:???
postgres アカウントでログイン後 pwd したらありますた。逝ってきまつ。
bash-2.05b$ pwd
/var/lib/pgsql/data
>>500様
先立つ不孝をお許しください。
502 :
NAME IS NULL:03/11/25 14:36 ID:db7RU1wF
>>501 罰としてpgsql-jp-MLに入会して、[pgsql-jp: 31584]に対して
「メールマガジン専用さんは書きました」
という引用から返答をかくべし
あれー、みんな7.4にして問題出てないっすか?
initdb でできたpg_hba.conf が使えないんですけど・・・
結局、255.255.255.255がおかしいってエラーだったんで
アドレス、マスク指定を 127.0.0.1 255.255.255.255 -> 127.0.0.1/32 に
したら使えるようにはなったんだけど、
1台にいくつも違うバージョンいれてるせいでこんがらがったのかなぁ・・・
504 :
499:03/11/25 15:32 ID:???
>>502 ユーザー会のMLで同じ質問が出ているなら答えてやろうと思って
入会した「後で」件の発言見たら、全然違う内容ぢゃないですかぁw
先にアーカイブ見てから入会するんだったw
505 :
NAME IS NULL:03/11/25 17:26 ID:db7RU1wF
506 :
NAME IS NULL:03/11/26 21:03 ID:K19juM7H
7.2から7.3で結構スピード速くなってるんだけど、なんでだっけ?
7.3から7.4はそんなにかわってない。サブクエリー使わなかったら同じかな。
7.2はコスト予測のバランスがおかしかったから。
toastじゃなかったっけ
509 :
NAME IS NULL:03/11/27 07:51 ID:poQ5XUV+
phpPgAdmin を入れてみたのですが、
どうも、日本語をvalueに入れると文字化けしているようです。
これに対する対処法はないでしょうか?
また、他にも、ウェブからpostgresをいじれるツールがあれば、
教えていただければ幸いです。
FreeBSD4.7とPostgres7なのですが、
アクセスからODBC経由でテーブルのリンクを作成しようとしても、
また、CSEから(非ODBC経由で)アクセスしても、
fe_sendauth: authentication type 5 not supported
というエラーが発生してしまいます。
いったいなぜなのでしょうか?
ぐぐってみても、実際にそのエラーがでちゃってるページしか見つからず。。。
教えていただければ幸いです。
511 :
510:03/11/27 08:20 ID:???
すいません、SSHのIDとDBのユーザ名がごちゃごちゃになっていた模様です。。
ちょっと勉強しなおしてきます。
512 :
510:03/11/27 08:35 ID:???
たびたびすみません、勘違いしてたように見えたのですが、正しくなってました。
DBのユーザ名入れるところにSSHのログイン名を入れたかと思っていましたが、
ちゃんとDBのユーザ名が入ってました。
MS SQL のデータ(*.mdf) を読みこんで、
PostgreSQL で使うにはどうやったらいいですか?
(てか可能ですか?)
>>513 SQL文に展開して読み直せば大抵のことはできるだろ。
つーか普通別プラットフォームに移すときゃそうする。
あとはテーブル定義部の非互換に気をつけれ。
515 :
NAME IS NULL:03/11/28 19:27 ID:xhqz25qz
シーケンスを使用すると、シーケンス管理用のテーブルが作成されると思いますが、
その中に、log_cnt というカラムがあると思います。
このカラムの値が、不規則に変化するのですが、どういう意味があるのかわかる方は
いらっしゃいませんでしょうか?
よろしくお願いします。
517 :
NAME IS NULL:03/12/03 08:17 ID:p9askHyN
どなたか教えて下さい。3つのテーブルがあり、
hudousan(id serial, area_id char(4), type_id char(4), menseki int)
area(area_id char(4), area varchar(32), area_yomi varchar(64))
type(type_id char(4), type varchar(32), type_yomi varchar(64))
としています。area,typeには漢字, area_yomi,type_yomiにはカタカナが入ってます。
select hudousan.id, area.area, type.type from
((hudousan inner joint area on hudousan.area_id=area.area_id)
inner join type on hudousan.type_id = type.type_id)
としたいのですが、漢字が表示されません。
このクエリはおかしいでしょうか?
どなたか解決のヒントをいただけないでしょうか?
ちなみに漢字でなくカタカナなら、たとえば
select hudousan.id, area.area_yomi, type.type_yomi~
とすると正常に表示されます。
また、3つの結合ではなく2つなら、たとえば
select * from hudousan.id, area.area from hudousan inner join
hudousan.area_id=area.area_id
とすると正常に漢字は表示されます。
表示されないとは?
psql なのか?文字コードは何にしてる?
519 :
517:03/12/03 17:54 ID:Q2KFNKSm
518さんレスありがとうございます。
psqlです。
select hudousan.id, area.area, type.type from
(hudousan inner joint area on hudousan.area_id=area.area_id)
inner join type on hudousan.type_id = type.type_id)
として
id | area | type
--------------------------------
1 | 何処 | 一戸建
のように表示したいのですが
id | area | type
--------------------------------
| |
のように何も表示されないのです。
areaをarea_yomi、tyypeをtype_yomiにすると
id | area_yomi | type_yomi
--------------------------------
1 | ドコカ | コダテ
のように表示できるのですが・・
同じテーブルのあるカラムは表示できて別のカラムは表示できないので
文字コードの問題ではなくテーブルの型やSQLの問題のような気がする
のですがよくわかりません。
Encoding は EUC_JP になってる?
521 :
517:03/12/03 19:24 ID:y3FHYBXx
520さん、レスありがとうございます。
psql -l で調べるとEUC-JP になってます。
ちなみに postgresql-7.2.3 on vine2.6 です。
select hudousan.id, area.area, type.type from ((hudousan inner join area
on hudousan.area_id=area.area_id) inner join type on hudousan.type_id = type.type_id) ;
id | area | type
----+------+--------
1 | 何処 | 一戸建
(1 row)
普通に出るけどな・・・
PostgreSQL 7.2.1 on i386-pc-solaris2.8 で
すいませんが教えてください。
infoというテーブル
Column | Type | Modifiers
--------+-----------------------------+-----------
id | character varying(128) | not null
があり、これをdeleteしたときにinfo_deletedという以下のような
テーブルにいつ消されたかバックアップをとりたいと考えています。
Column | Type | Modifiers
------------+-----------------------------+-----------
id | character varying(128) | not null
deleted_at | timestamp without time zone | not null
そこで以下のようなinfo_del_backupというルールを作成しました。
create rule info_del_backup as on delete to info do insert into info_deleted (id,deleted_at) SELECT id,'now' from info wehre id = old.id;
たしかにinfoからレコードを消したらinfo_deletedにバックアップしてくれるのですが、
deleted_atに消した日時が入ってほしいのになぜかルールを作成した日時が入ってしまいます。
ルールを作成したときに'now'が展開されてしまっているのかなと思いましたが、これを
動的な'now'にするにはどのようにすればよいでしょうか。
postgres7.4を使っております。
初めての書き込みですので厨房な質問でしたら申し訳ありません。
524 :
523:03/12/03 21:27 ID:???
googleで調べたら
'now'じゃなくてnow()をつかえばいいと書いてありました。
1分で自己解決してしまった。
スレ汚しすいませんでした。
>>521 EUC-JPなDBにSJISを突っ込んでいるとか?
でも、INSERTするときにエラーが出るはずか?
>>524に便乗質問だが
昔は DEFAULT 'now'::text
にしてたんだが、今はそうしない方がいいの?
527 :
NAME IS NULL:03/12/04 04:43 ID:6qT9TARo
>>526 昔から、ルールとかファンクションとかビューには'now'使えないと思うのだが。
あぼーん
TABLE作成時に now が展開されないようにtextにキャストする
のは、最近のやつは必要なくなってる、みたい
しかし、pg_dumpから持ってくると展開されてるし
常に注意が必要だな
530 :
NAME IS NULL:03/12/05 12:30 ID:cBAsm9bR
PostgreSQL へのクエリを SOAP などの
XML ベースのフレームワークを用いて行いたいと考えています。
たとえば SQL 文を XML 文書で表現する場合の XML スキーマなどは
どこかで標準化されているのでしょうか?
531 :
NAME IS NULL:03/12/05 12:47 ID:cBAsm9bR
532 :
NAME IS NULL:03/12/06 18:22 ID:A0+Y6Cuw
ご存知の方教えてください。
ODBC(7.03.200)+ADOをVBから接続しているのですが、
レコードセットでchar,varchar型の列から全角文字を読み出すと、
列定義長の半分しか読み出せません。
例えばchar(8)と定義した列には全角文字が8文字まで格納でき、
psql上では読み出しもOKです。しかしODBC+ADOのレコードセット
で読み出すと、先頭4文字しか読み出せません。同様の現象は
windows上のpgAdminIIでも発生してます。
ところがAccessのテーブルリンクでは正常に読み出せます。
なにか設定がおかしいのでしょうか?
データベースはEUC_JPです。
ODBCのバージョンとパッチは?
あ、書いてあったか。失礼
PostgreSQLのバージョンによってはあわんかもしれんが
7.3.xぽいしなあ
7.3.3と7.2.3で検証しています。
ODBCログを見てるとデータ自体は届いてるようで、
Accessテーブルリンクは97/2000ともに読み出せてます。
ADO経由だとだめのようなのです。
単純にSQLの書き方なのでスレ違いかもしれませんが、pgsqlを使っているのでココで質問します。
ID(varchar),日付(date),数量(int) のテーブルで日付順にソートしながら、
その日までの累計も出力したいのですが、どのように書けばいいのでしょうか?
ID | 日 付 |数量|累計
A1| 2003-12- 1 | 5 | 5
A1| 2003-12- 2 | 3 | 8
A1| 2003-12- 3 | 2 | 10
A1| 2003-12- 4 | 7 | 17
よろしくです。
537 :
○:03/12/07 18:05 ID:kXPpNlp0
テーブルのバージョン管理を試みているのですが、
ちょっと質問です。
あるテーブルに対して、UPDATE等をしたときに、
古い情報も残しておきたいので、
その方法として、RULEを作って
UPDATEしたときに、前(old)のテーブルをまるまる テーブルv1 としてコピーして、
テーブルを更新しようと考えています。
そのときに、テーブルそのものに”テーブルのバージョン”を
つけたいのですが、どうすればいいか誰かご存知の方いらっしゃいましたら
教えてください。
もし、テーブルそのものにバージョンがつけれたら、
RULE でテーブルをコピーする際に、 テーブル_v[バージョン] というような
ことをしたいと考えてます。
ところで、通常、SQLでは、UPDATE等した時のバージョン管理は
どうなっているのでしょうか?
CVSなら、差分とってるので、いざ前バージョンのものを使いたいときでも
簡単なのですが・・・。
RDBMSをCVSと同じような感覚で語られてもな。
>>538 CVSに慣れてくると、
なんでファイルシステムとかDBに履歴とかブランチが
つけれないんだよーとか思うようになるのでつ。
Rajeev Nager本を読んだからといって、NT向けのファイルシステムドライバが
そうそう簡単に書けるわけでもないし…
閑話休題。Postgresの設計だったら、任意の時点に
チェックポイント打ち込んでその時点の状態を参照できるように
する改造は不可能ではない予感(簡単じゃねーと思うが)
VACUUMは、最古チェックポイントより手前のみで行うという
運用にすれば…
540 :
NAME IS NULL:03/12/08 01:57 ID:IhBabMF7
>>539 > CVSに慣れてくると、
> なんでファイルシステムとかDBに履歴とかブランチが
> つけれないんだよーとか思うようになるのでつ。
なんか、ナントカを覚えたサルみたい。
>539
そんな話なら、タプルヘッダが持ってるデータと同じような情報を
テーブルに自分で追加すればいいだけだと思うがな。
>540
postgresは追記型だから云々とかゆーことを知ったばかりなんだろうね。
オプソだからソースいじれるんだぜ!とか思っちゃったんだろうね。
>>539 RDBはRDBとして歴史が長いので、
その枠組みの中で解決した方がいいと思うよ。
素人が独自なことを考えてもろくなことにならない。
>>539 その機能昔のバージョンにあったよ。今は消えたけど。
>>532です。
追加ですが、
VBからDAO3.6でアクセスしてみると大丈夫でした。
逆にAccessVBAからADOでアクセスすると先の不具合は再現します。
(ADO2.1〜2.8で検証)
また、SQL文の時点で当該項目にTRIMをかけておいてやると
問題なく読み出せるようになります。なんとなくプロバイダとのスキーマ
情報のやりとりでミスってるような気が。。。
改めて質問ですが、ODBC+ADOで使用されている方はこのような
現象に遭遇していないでしょうか?
ウチの環境の問題だけであってほしいのですが。。。
547 :
NAME IS NULL:03/12/08 12:00 ID:kFaI7gRU
>>539 RDBだから、というのが一番君が押さえておくポイントだと思うよ。
まぁ有っても良い機能だが、RDBという考え方の再考が求められる
ような機能だな。
548 :
NAME IS NULL:03/12/08 12:08 ID:kFaI7gRU
>>547 を書いて思った。
RDBは、静的な分析を対象にしているなぁと。
確かにこれはデータ-ベースという枠組みとして欠点かも知れないね。
これに対する全く違った解答で、OODB(オブジェクト指向データベース)
と言うものが過去(今も現役だけど)注目された事が有った、
君が求めているように、オブジェクトの成長や改変に合わせて対応するような
仕組みも有った。
しかし、基本的にRDBMSに比べてオーバヘッドが大きく、OODBとして使うのが
精一杯(それでRDBより遅い)で、あまり普及していない。
549 :
539:03/12/08 12:40 ID:???
起きたらビクーリだ(w
考え直してみると、保守のためにそのような機能をつけたところで
みんなその機能を運用のために使うようになってしまい、
パフォーマンス・安定性の新たな火種になってしまうことを
想像すべきだった。昔は実装されてたというのは、7.0の頃からの
ユーザだったのでしらんかった。
サル呼ばわりも含め勉強になった。thx
つーか、RDBMSは、常に変化していくデータの中で、
如何に「一瞬を取り出すか(そしてACID制約のもとで更新するか)」という
問題だと思う。
PostgreSQLの場合は、それを「Snapshot」と呼んでいるわけだが。
551 :
NAME IS NULLNULL:03/12/09 03:57 ID:OBdz5fAC
http://www.postgresql.jp/document/pg734doc/programmer/plpgsql-declarations.html にある、例
CREATE FUNCTION use_two_tables(tablename) RETURNS TEXT AS '
DECLARE
in_t ALIAS FOR $1;
use_t table2name%ROWTYPE;
BEGIN
SELECT * INTO use_t FROM table2name WHERE ... ;
RETURN in_t.f1 || use_t.f3 || in_t.f5 || use_t.f7;
END;
' LANGUAGE 'plpgsql';
を参考に、tablenameを引数にとるような FUNCTION をつくりたいのですが、
ERROR: Type "tablename" does not exist
hoge=#
と怒られてしまいます。
環境は、FreeBSD 4.8 release上で、
psql (PostgreSQL) 7.3.2
を使っています。
FUNCTIONでテーブル名を引数にとる場合、引数の型はどうのようにしたらいいのでしょうか?
552 :
536:03/12/09 09:36 ID:???
誰か、お願いします。m(_._)m
基本的にそれは無理
EXECUTE を使えばいけるかも
554 :
553:03/12/09 10:15 ID:???
>>536のも普通無理でないか
Group by でまとめたやつと範囲指定で集計したやつをくっつければ
できるかもしれんが、そもそも考え方がおかしい
>>536 まあ、無難なのは一時表作ることだろうねぇ。
気合いを入れてSQL書いてもメンテナンス性が悪くなるだけで、
ろくなことにならないと思う。速度もたいして変わらないし。
557 :
536:03/12/09 11:12 ID:???
>>555-556 どもありがとう。
出来ないなら出来ないとわかったので、すっきりしました。
PostgreSQL 7.1.3 ドキュメント(日本語版 1.6) によると
character(n), char(n) (4+n) バイト SQL互換性あり 固定長文字列(空白可)
character varying(n), varchar(n) (4+n) バイト SQL互換性あり 制限付の可変長文字列
text (4+n) バイト もっとも柔軟性がある 制限無しの可変長文字列
text はもっとも柔軟性がある、と書かれているのですが、もっとも
柔軟性があるのに、char や varcha をあえて使う理由はあるのでしょうか?
text にした場合のメリット、デメリットは何でしょうか?
>>558 たまたまPostgresの実装が、
CHARおよびVARCHARの実装=制約付きTEXTの実装
となってるということだと思われ。
他システムに移植するとき、TEXTは制限がキツいことが多い。
たとえば、SybaseおよびMS SQLだと TEXT は BLOB で実装されているので、
・記憶容量が1ページ(数KBほど)以上取られてしまう
・インデクスをつけられない、もちろん主キーに設定できない
・その他もろもろ
逆にPostgres以外のRDBMSだと、
CHAR最強だったりVARCHAR最強だったり、いろいろあったりする。
というわけで、
メリット 柔軟性が高まる
デメリット 他システムに移植するときに困るかも
みたいな感じだろう。
560 :
558:03/12/09 15:12 ID:???
>> 559
詳細な解説ありがとうございます。
という事は、Postgres でのみの稼働の場合(移植を考慮する必要全くなし)
は、文字列のフィールドにはあらゆる text を使っておけばよい
という事ですかね。
ありがとうございました。
藻前様方は NUMERIC って使ってまつか?
使った感じはどうでつか?いい感じでつか?
7.3.5には興味ないのね・・・
先生と、いわれるほどの馬鹿でなし
564 :
NAME IS NULL:03/12/10 19:28 ID:YxYB+J4x
シェルスクリプトの中で,
例えば,$SQL というシェル変数に,
ある sql 文の文字列をもっているとします.
この sql を(シェルスクリプトの中で)
psql を使って,database という名前のデータベースに
かましてやるにはどうしたらいいのでしょうか?
item に商品名、dt に売れた日が入っているとして
売れた日順に item を並べたいのですが
select distinct item from T1 order by dt desc;
と書くと
ERROR: For SELECT DISTINCT, ORDER BY expressions must appear in target list
と言われるのですが、こういう場合はどう書くのでしょうか。
>>566 distinct やめて group by item でいいんじゃね?
便乗質問なんだけど、
>>566の例でいうと、売れたitemが何種類あるか、
って一発でわかる方法ってある?group by して count(item) ってやっても
item | count
-----+-----
A | 3
B | 2
C | 5
(3 rows)
みたいになっちゃうと思うんだけど、この場合はA、B、Cの三種類ということで
3という値が欲しいんです。今は仕方なく pg_numrows() でやってる。
>>567 select count(*) from (select count(item) from t1 group by item);
570 :
566:03/12/11 12:55 ID:???
>>567 ありがとうございます。group by はこれでいいですよね?
select item,max(dt) from T1 group by item order by max(dt) desc;
調べても分かりませんでしたので、恥を忍んで質問させてください。
レコードが20件も無いテーブルで単純に
select * from mytable;
としただけで15秒近く検索に時間がかかってしまい困ってます。
他の数万件もレコードのあるテーブルは一瞬なのに
そのテーブルだけ何故か時間がかかります。
そのテーブルは22個の項目から出来ていて、以下のような感じです。
integer 5個
timestamp 1個
text 2個 (最大500文字くらいの日本語です)
smallint[] 12個(配列は最大10個くらいのデータを格納)
boolean 2個
select count(*)でも同じ時間がかかります。
VACUUMや、共有メモリを増やしてもどうにもなりませんでした。
配列やtextの型が駄目なのかと思い、CHARに変えたりしても駄目でした。
どなたかこの問題の原因がお分かりになる方いらっしゃいますか?
FreeBSD4.8 Release
postgresql 7.3.3
Xeon 2.0GHz
mem 512MB( sharebuffer = 8192 , sortmem = 1024 )
>>571 explain select * from mytable;
お客さん用の管理画面をウェブ上で作ろうとしているのですが、
操作履歴テーブルを用意して担当者の操作の履歴を書き込むのに
トリガやルールを使うのはどうかなと思ったのですが、
実行時にパラメータを渡すようなことってできますでしょうか?
>>572 ご返答ありがとうございました。
explainというのは知りませんでしたが、便利ですね。
教えていただいた文を試しましたところ、
Seq scan on mytable ( cost=0.00..47934.17 rows=47 width=565 )
という結果が出ました。いかがでしょうか?
>>574のrowsは17でした。手コピーなので間違えました。すいません。
>>574 「順スキャンをやっています」「ものすごく時間がかかります」
ということがわかる。
それにしても、基準値変えてないとしたらその程度のクエリで
コスト見積もり48000てのは異常だなぁ・・・
INDEX使うとかなんとかならんの?
あの程度の行数(17行)ならIndex云々じゃないと思う。
システムカタログぶっ壊れとか、ファイルシステムそのものが逝っちゃっているとか。
ちょと異常杉。
なぜ手コピー。TeraTerm って C-c でコピーできないからというオチじゃないよね。
579 :
554:03/12/12 22:49 ID:???
遅れてすいませんでした。DION規制があって書き込めませんでした。
>>559さん
レスありがとうございます。
INDEXを検索に使う項目につけてみましたが速度は相変わらずでした。
他の10000件以上レコードのあるテーブルに同じ事をやると0.00..197.24という数字なので
リソース不足ではないと思うんですが、謎です・・・
>>560 助言ありがとうございます。
やはり異常でしょうか((( ;゚Д゚)))ガクガクブルブル
前に同じ事があった時はテーブルをtruncateして早くなりましたが、
数十件をINSERTすると、すぐ今の遅さに戻ってしまいます。
また、性質上何度もtruncate出来ないテーブルなので、これによる解決は出来ません。
もしかしたらなんですが、このテーブル名がinfoであることは何か関係ないでしょうか?
>>561 つっこみありがとうございます。
サーバーマシンと、Windowsマシン(2chはこっち)を切り替えて使ってるというだけです。
配列やめても変わらん?
vaccum full analyze とか。
582 :
554:03/12/12 23:20 ID:???
慌ててて、さん付けしてませんでしたw失礼しました。
>>563さん
即レスありがとうございます。
実を申しますと配列の前はCHARで実現していたテーブルなんですが、それが同じように遅くなってしまい、
藁にもすがる思いで配列ならと思って配列に変えてみたんです。
しかし結果はごらんの通り変わらず、嘆いています。
性質上それほど参照するテーブルでもないので我慢すれば済むんですけど、
もし同じ経験をされた方がいれば、知恵をお貸し出来ればと思った次第です。
>>564さん
提案ありがとうございます。
VACUUM ANALYZEは行いましたが、FULLオプションは付けませんでした。
物理的に今は出来ないので、次会社に行った時にやってみます。
ところで、説明を読んだんですが、これは完全にDBを止めてしまうんですよね?
これが、ちょっと怖かったんですが、
単純にpg_dump > mydbとした時のmydbサイズが1MBだとした場合に
VACUUM FULL ANALYZE;はどの程度時間がかかるものなんでしょうか?
>>582 数秒。これで数分かかったらディスク異常かな。
規模とマシン性能からみて数十秒でも長いと思う。
584 :
571:03/12/13 02:05 ID:???
レス番号激しくズレてました。openjane.
上の名前554は
>>571の質問した人です。見づらくってすみませぬ。。。
>>582 日本語変でした。
知恵をお貸し=>知恵をお借り
貸すほど知恵余ってませんw
>>583さん
なるほど、ありがとうございます。
おかげさまで安心しました。
こっそり試してみまつ。
そういえば、HDD性能書き忘れてましたが、
内臓SCSIのU320のRPM10000、RAID無しでした。
容量は幸か不幸か全てのパーティションでかなり余ってますので、
一見問題なさそうに動いてますがディスク異常は仰る通り疑ってみたいです。
つか、pg_dump したやつ晒してみろや(゚Д゚)ゴルゥア!
586 :
583:03/12/13 03:08 ID:???
ああ、ダンプ後で1MBの話か・・・
数秒はどうだろう?でも分単位はかからない、はず。
>>584 1行当たり精々3KBぐらいなので、17行で51KB程度のテーブルなのに、
見積もりコスト48000x8KB=375MBってのがそもそも異常。
1ページ=1Byteで計算しているような値だ。
pgsql本体が壊れている感じもしないわけでもないが、他のテーブルで
問題ないというのも摩訶不思議
なお、vacuumはDBそのものを止めるのではなくて、vacuum中のテーブルだけ
ロックするので、
vacuum full analyze 問題のテーブル;
とすればよろし。
#なんか、create tableがうまく出来なくなっている感じがしないわけでもない。
#他のテーブル=過去に作成したテーブルのときは問題なくて、ある時点を
#境に、まともなtableを作れなくなってしまっているとか。
#ま、外している可能性大なので、独り言モードw
588 :
571:03/12/15 15:38 ID:???
レス遅れてすみません。
教えて頂いた通り
VACUUM FULL ANALYZE info;
を実行したら、驚くほど早くなりました。
前と全く同じSQLをexplainで計測すると
cost=0.00..2.23
という数字でした。素人の私でも相当早くなった事が分かります。
FULLつけたくらいで、と半信半疑でしたが反省してます。
すごすぎます。偉すぎます。FULL
1分くらいかかり、その間アクセス不可でしたが、
これから遅くなったらまずFULLを試してみます。
皆さんありがとうございました。
長々と居座ってしまいすみませんでした。
何故このような状態になったかだけが引っかかりますが、
結果よしということで、満足しています。聞いてみてよかったです。
よかったですね。
FULL 付けないと UPDATE/DELETE のゴミが残ります。
頻繁に更新があるなら毎時間 VACUUM; して、
アクセスの少ない時間に VACUUM FULL; するといいかも。
>>588 >長々と居座ってしまいすみませんでした。
このスレの存在意義があったってことだな(w
591 :
NAME IS NULL:03/12/16 15:40 ID:yb6Py4Lp
postgresql7.4でeRserverを組み込んで
レプリケーションをしたいと思っているのですが、
eRserverのREADMEを読んでもレプリケーションの
方法がわかりません。
また、eRserverがJAVAベースで動くって事は、
JDK 1.2.2orJDK 1.3.1が要りますよね。
FreeBSD4.4にJDKインストールしたときに
JDKが落ちまくってた経験があるので、
二の足を踏んでいます。
どなたかアドバイスをお願いいたします。
postgres7.3に保存してあるデータをoracle9iに移行したいのですが。
自分が考えてるのが、一度CSVファイルに落としてからoracleにインポートする
という方法なのですが、もっと手軽にデータを移行できる方法ってないでしょうか?
>>592 Access挟んで全件SELECT→INSERT
594 :
NAME IS NULL:03/12/17 02:11 ID:p/6HMCOu
よく分かんないけど、OracleかMiracleあたりにマイグレーションツールが
あるんじゃない?
595 :
592:03/12/17 03:49 ID:???
>>593 >>594 お返事ありがとうございます。
マイグレーションツール探してみましたが、どれも製品化されているものばかりでした。
oracle絡んでるので当然といえば当然でしょうが、できればコストをかけずに移行したいです。
あと説明不足で申し訳なかったのですが、テーブル単位ではなくDB単位で移行する方法はないでしょうか?
pg_dumpで落としたファイルをperlなどでデータのみ抽出したりできますか?
pg_dump -D で insert 形式にして
perl で oracle 用に置換する
のを 592 が公開する。
> pg_dumpで落としたファイルをperlなどでデータのみ抽出したりできますか?
pg_dump -a(or --data-only) でデータだけ落とせると思うけど。
pg_dumpだけでも、結構いろんなことできるよ。
id | sinamono | suuryou
--------------------------------
1 | りんご | 100
2 | みかん | 200
こういったテーブルで、id,sinamono,suuryouを取得する方法はありませんか?
id,sinamono,suuryouの値(「1」「りんご」「100」)じゃありません。
「id」「sinamono」「suuryou」といった項目名がほしいのです。
>>599 phpならpg_num_fieldsで取れますけど。
>>600 多分 pg_field_name() と言いたかったんだろうね
>>599 ちょっと長いけどこんなのは?
select
attname
from
pg_attribute
where
attnum > 0 and
attrelid = (select relfilenode from pg_class where relname = 'hoge_table')
order by attnum
;
603 :
599:03/12/18 14:16 ID:???
>>600-601 すいません。環境書いてませんでした。
Perlだったのですが近いうちにPHPも使おうと思っているので記憶しておきますね。
>>602 ありがとうございます!
ためしたところ、ちゃんと取得できるようになりました。
自分でもいろいろやってみたのですが、cmaxやらxmaxやらも出てきて
これじゃないのかなぁ・・・とか思ってみたり・・・
attnumを使えばよかったのですね。
使わせてもらいます。
604 :
NAME IS NULL:03/12/18 21:48 ID:QiHxPYDL
postgreSQLってshift-jisの文字列は格納できないのでしょうか?
>>604 できない。
けど、Client_EncodingでSJISと指定すれば、
バックエンド側でSJIS<->EUC-JP変換してくれる。
(のだったと思う)
>>605 そうですか。その場合DoCoMoの絵文字が入った文字列を格納したら
取り出した時には文字化けしてでてくるんでしょうか?
ちょっと手元にないので分からないのですが。
>>605 それはネタだよね。
マジレスすれば、データベース作成のときに-eで指定すればいい。
>>608 スマソ
SJISの指定ができるのは7.0のバグだったらしい。
>>609 それじゃぁ、気をとりなおしてw
>>606 EUC-JPオンリーな環境しか使ってないので、試したことない。
実際、SJISのまま突っ込んだことがないので、あれなんだが、
「EUC-JPの範疇じゃねぇよ」って怒られた記憶があるので、
SJISのまま強引に突っ込むことは出来ないものと思っている。
で、機種依存文字がEUC-JP(の範疇)に変換されるのかどうかも
しらんし。glibcのiconv()なんて、○数字も変換できなかったと思うが
pgsqlがどのようにコード変換しているかもシラネ。
つうことで、がんばって検証してくれ。
もしくはもっとエロい人が答えてくれるかな。
検証したら報告よろしく。
この板の雰囲気っていいよね。
612 :
訂正:03/12/19 00:57 ID:???
×板
〇スレ
PostgreSQLのShift_JISはCP932と同等だといつかMLに書かれていたと思う。
ってかさ。
Oracleでもその他でもSJIS入れられるよね。
PostgreSQLは対応の予定はないのかな?
よくMLとかでEUC_JPで入れてClient_Encodingで変換するのが「常套」って
いう回答がつくけど、客の要件によっちゃそれが許されないことも有るよね。
それだけでpgsqlが却下になるのが寂しい。
責めてるわけじゃないです。もっと使い勝手とか良くなるといいなと思ってるだけ。
延び延びになってるWin版だとSJISになるんだろうか。
>>615 PowerGresはどうなってんだろうか。
ま、下手にSJISつかって5C問題あたりに悩むより、
EUC-JPのみの方が手間減るのでイイ派なんだけど。
>>615 > 客の要件によっちゃそれが許されないことも有るよね
たとえばどんな用件?
618 :
:03/12/20 15:38 ID:???
>>617 2ちゃんねる過去ログ保管 DB とか?
それだったらUTF-8でいいような。EUC-JPじゃ無理だろうけど。
UTF-8使うぐらいならMULE_INTERNALの方がまし。
漏れはデータベース内部コードにUTF-8は禁忌だと思う。
621 :
:03/12/20 18:12 ID:???
>>620 近畿ってどんなふうに?
MULE内部コードがどう優れているのか知識はないが、少なくとも
SJISやEUCはUTF8より劣ると思うがね。
>>621 MULE内部コードとUTF8じゃあたいしてサイズは変わらんと思うが。
外字のせいでSJISのままでないと困ることがある。
EUC-JPやUTF-8だとマッピングが不十分だし。
624 :
NAME IS NULL:03/12/21 00:39 ID:FmsnEdAt
>>617 他人だけど、簡単に思いつくのが、
ちんけなDBアクセスソフトを使って、エクセルであんな事したり、
こんな事したい時なんじゃないかな?
エンドユーザにも分析データ提供したいけど、エンドユーザに
コード変換のわずらわしさを説明するのが大変な時。
いわゆる外字ってのはSJISですらないからなぁ。
>>622 MULE内部コードとSJIS/EUC-JPは数式的な変換で逝ける。
UTF-8を使うとテーブルマッピングになる。この変換表が
各社各様バラバラで「混ぜるな危険」なのですよ。
多少の文字化けを全く気にしないなら好きにしていいと思う。
>>626 UTF8を内部コードに用いるのに何か致命的な欠点でもあるのかと
思ったが、その程度の話だったのかな?
要は混ぜなきゃ良いわけだし。というか、Postgresの内部⇔外部
コードのマッピングの話なワケだから、そこに「各社各様バラバラ」な
変換表という話が関係してくる理由がよくわからない。
>>627 UTF-8のまま外に引っ張り出すclientがいたらそれが風穴になってしまう。
それ内部コードの話じゃないじゃん。
>>628 それは、SJIS->UTF-8だと解決できるのか?
631 :
NAME IS NULL:03/12/24 20:29 ID:NdhqK1Dk
postgresql7.3.5で、./configure --prefix=/usr/local/pgsql --with-java
makeとすると、下記エラーが出て、インストールできません。
PCの環境は下記です。
OS:RedHatLinux7.3
コンパイラ:jdk1.3.1_07
JDBC:ant-1.5.1
DB:PostgreSQL7.2.3
Web:Apache1.3.29
Tomcat 3.2.4
※ApacheとTomcatは連携の設定をしています。
/home/postgres/.bashrcには、下記の値が入力されています。
#PATH=$PATH:$HOME/bin:/usr/local/pgsql/bin
export JAVA_HOME=/usr/java/jdk1.3.1_07
export ANT_HOME=/usr/local/jakarta-ant-1.5.1
export PATH=$PATH:$JAVA_HOME/bin:$ANT_HOME/bin
export POSTGRES_HOME=/usr/local/pgsql
export PATH="$PATH":/usr/local/pgsql/bin
export PGLIB=$POSTGRES_HOME/lib
export PGDATA=$POSTGRES_HOME/data
export MANPATH="$MANPATH":$POSTGRES_HOME/man
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH":"$PGLIB"
export
CLASSPATH=/usr/local/pgsql/share/java/postgresql.jar:/usr/local/pgsql/share/java/postgresql-examples.jar
/etc/profileには、下記の値が入力されています。
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC
export JAVA_HOME=/usr/java/jdk1.3.1_07
export TOMCAT_HOME=/usr/local/jakarta-tomcat-3.2.4
export PATH=$PATH:$JAVA_HOME/bin:$TOMCAT_HOME/bin
#export PATH=$PATH:$JAVA_HOME/bin:
#export TOMCAT_HOME=/usr/local/tomcat
export
CLASSPATH=.:$JAVA_HOME/lib/tools.jar:/usr/local/jakarta-tomcat-3.2.4/lib/servlet.jar:/usr/local/pgsql/share/java/postgresql.jar
for i in /etc/profile.d/*.sh ; do
以上がPCの設定です。
エラー内容は次に続きます。
632 :
631:03/12/24 20:32 ID:NdhqK1Dk
compile:
[javac] Compiling 50 source files to /usr/local/pgsql/postgresql-7.3.5/src/interfaces/jdbc/build
[javac] /usr/local/pgsql/postgresql-7.3.5/src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2
ResultSet.java:244: シンボルを解釈処理できません。
[javac] シンボル: コンストラクタ Array (org.postgresql.PGConnection,int,org.postgresql.Field,java.sql.ResultSet)
[javac] 位置 : org.postgresql.jdbc2.Array の クラス
[javac] return (java.sql.Array) new org.postgresql.jdbc2.Array( connection, i, fields[i - 1],
(java.sql.ResultSet) this );
[javac] ^
[javac] /usr/local/pgsql/postgresql-7.3.5/src/interfaces/jdbc/org/postgresql/jdbc2/
AbstractJdbc2ResultSet.java:424: 互換性のない型
[javac] 出現: java.sql.Statement
[javac] 要求: org.postgresql.jdbc2.Statement
[javac] return statement;
[javac] 注: 一部の入力ファイルは推奨されない API を使用またはオーバーライドしています。
[javac] 注: 詳細については、-deprecation オプションを指定して再コンパイルしてください。
[javac] エラー 11 個
BUILD FAILED
file:/usr/local/pgsql/postgresql-7.3.5/src/interfaces/jdbc/build.xml:104: Compile
failed; see the compiler error output for details.
Total time: 5 seconds
make[3]: *** [all] エラー 1
make[3]: 出ます ディレクトリ `/usr/local/pgsql/postgresql-7.3.5/src/interfaces/jdbc'
make[2]: *** [all] エラー 2
make[2]: 出ます ディレクトリ `/usr/local/pgsql/postgresql-7.3.5/src/interfaces'
make[1]: *** [all] エラー 2
make[1]: 出ます ディレクトリ `/usr/local/pgsql/postgresql-7.3.5/src'
make: *** [all] エラー 2
というエラーになってしまいました。
別PCで、
antやjdkのバージョンを同じ環境でテストしてみたのですが正常に
インストールできるのてしまいました。なぜ今回はできなかったのでしょうか?
アドバイスお願いできませんでしょうか?長くてすいませんでした。。。
イヴに質問です。
PostgreSQL 7.3.4 を使って DBを構築してます。
全てのテーブルに update_time カラムを設けて、
そのレコードに UPDATE のSQLクエリが来た時は、
常に update_time カラムに更新された日時(CURRENT_TIMESTAMP)を入れたいです。
CREATE TABLE 時にこういったオプションはあるのでしょうか?
ON UPDATE というのがあるんですが、これは外部キーだけのようなので…。
任意の乱数をn個まとめて得る SQL って書けますか?
SELECT random() LIMIT 10;
ではもちろんダメですた…
>>634 select random() from n行以上あるテーブル limit n;
こんなんじゃダメか?
>>633 updateするときにupdate_timeもnow()で更新すればいいじゃないの。
>>637 つーか、一度に複数の乱数が要る(用意する)必要性がわからない。
639 :
633:03/12/25 02:27 ID:???
>>636 UPDATE 時に update_time も CURRENT_TIMESTAMP でアップデートすればいいんですけど、
それを CREATE TABLE 時に設定して自動でいかないかなーと思ってました。
むりぽですかね…
>>637 MySQL ではそんなことできるんですか…!?
ってスレ違いですね。逝ってきます。。
>>638 実際にはそのまま INSERT したいんでつ。
INSERT INTO table (column) SELECT 複数行;
みたいな感じで。
そういう意味ではいきなりランダムでなく、一旦 INSERT してから UPDATE でも
いいんでつが、そもそもダミーで複数行を SELECT する方法がわかりません。
諸般の事情のため、ファイルから COPY するというのは却下でお願いします。
最悪それしかないかとも思っていますが…
>>639 MySQL の TIMESTAMP は常に現在時間
ポスグレでやるならトリガかな。
>>640 まだ、なにがしたいかさっぱりわからん。
乱数のcolumnのみを持つテーブルが必要行いるってことかな?
なんか根本(設計)的に間違っているような気がする。
>>642 つか君はわかったつもりで何にもわかってないタイプだな。
>>642 ちょっと具体的には書けないんです、すいません。
フィールドはもちろん乱数だけではありません。
設計自体は普通だと思うのですが、運用が多分普通じゃないんだと思います。
要は管理者がブラウザでボタンをクリックすると、自動的に複数行の
レコードを作成する(しかもレコード数は任意)、みたいな仕組みを
作りたいのですが、やはり一旦外部ファイルを作成するか、
>>635みたいにダミーのテーブルを用意するしかないですかねぇ…
乱数を複数レコード返す関数(ストアド)書きゃいいんじゃないの?
>>645 えらい!そうです、そうでした… なんで気づかなかったんだろ、胃って期末
>>643 そうかもしれん。いまだにさっぱりわからんw
乱数以外のcolumnに挿入すべき値が用意されているのなら、
乱数のcolumnはdefault randum()でいいような...
>>644 ブラウザ使うなら、
>要は管理者がブラウザでボタンをクリックすると、自動的に複数行の
>レコードを作成する(しかもレコード数は任意)、みたいな仕組みを
ここまではブラウザ用のHTML作成するときにソフト(perl,PHP,servlet,etc...)で
乱数振ってテーブルに複数行INSERTしちまうってのもありでは?
>>647 複数行というのが…
>>648 それでもいいんですけどね、時間かかるじゃないですか。
できれば SQL の中で完結したいんですよ。
ちなみに PL/pgSQL だと複数レコード返せなかったですね。
開発コスト考えると、ダミーテーブル用意するのが手っ取り早い気が
してきますた。
>>649 その時間がもったいないほどパフォーマンスに影響するのかと小一時間。
> ちなみに PL/pgSQL だと複数レコード返せなかったですね。
返せますけど。
>>650 時間がもったいないとは、CGIプログラムを作るのにスキル的に時間が
かかるってことかもしれない。
管理者がたまに使う程度の機能に、パフォーマンス気にしてもね。
>>652 しかし実際にSQLでやろうとして時間を無駄にしてるし。
655 :
649:03/12/26 00:21 ID:???
今
>>653がいいこと言った!
ちなみにこの処理、ボツになりました。今回は要らないそうです。
どうもお騒がせしました。
>633
'now'
psql で、全テーブルに対して権限を与える方法を教えてください。
GRANT ALL PRIVILEGES ON *.* TO `db_name`;
のように *.* や * では
ERROR: parser: parse error at or near "*" at character25
のようにエラーになります。
一括で権限を与えるにはどのように記述すればよいのでしょうか?
----------
MySQL で以下は問題なく動きます。
------------
<?php
header("Content-Type: text/xml");
?>
<?xml version="1.0" encoding="EUC-JP" standalone="yes" ?>
<?xml-stylesheet type="text/xsl" href="table.xsl" ?>
<result>
<?php
mysql_connect("localhost","root","root");
$rs=mysql_db_query("sample","SELECT * FROM master");
while($aryCol=mysql_fetch_assoc($rs)){
$aryKey=array_keys($aryCol);
print("<data>\n");
foreach($aryKey as $key){
print("<".$key.">".$aryCol[$key]."</".$key.">\n");
}
print("</data>\n");
}
?>
</result>
-----------
以上をpostgresSQLに接続させ表示させるには
-----------
<?php
header("Content-Type: text/xml");
?>
<?xml version="1.0" encoding="EUC-JP" standalone="yes" ?>
<?xml-stylesheet type="text/xsl" href="table.xsl" ?>
<result>
<?php
pg_connect("dbname=k user=k");
$rs=pg_query("select * from categ");
while($aryCol=pg_fetch_assoc($rs)){
$aryKey=array_keys($aryCol);
print("<data>\n");
foreach($aryKey as $key){
print("<".$key.">".$aryCol[$key]."</".$key.">\n");
}
print("</data>\n");
}
?>
</result>
--------------------
以上動かないので、間違っている点を誰か教えてください
age
connectの返り値とエラーコードをチェックしる
662 :
NAME IS NULL:03/12/29 00:59 ID:7uvR8b1+
CREATE TABLE test ( timestamp timestamp );
こんなテーブルに
timestamp
-----------------------
2003-12-27 17:09:59+09
2003-12-27 18:15:12+09
2003-12-27 18:19:14+09
2003-12-27 23:40:40+09
なレコードが入ってるんですが、
これを時刻単位で集計して、
time | count
--------------+-------
2003-12-27 00 | 0
2003-12-27 01 | 0
2003-12-27 02 | 0
2003-12-27 03 | 0
2003-12-27 04 | 0
2003-12-27 05 | 0
2003-12-27 06 | 0
2003-12-27 07 | 0
2003-12-27 08 | 0
2003-12-27 09 | 0
2003-12-27 10 | 0
2003-12-27 11 | 0
2003-12-27 12 | 0
2003-12-27 13 | 0
2003-12-27 14 | 0
2003-12-27 15 | 0
2003-12-27 16 | 0
2003-12-27 17 | 1
2003-12-27 18 | 2
2003-12-27 19 | 0
2003-12-27 20 | 0
2003-12-27 21 | 0
2003-12-27 22 | 0
2003-12-27 23 | 1
みたいな感じで、時間単位で集計し、0件のところも表示したいの
ですが、どうすればよいでしょうか。
現在、下記のようにしてますが、0件の表示がもちろんできません。
SELECT to_char(timestamp, 'YYYY-MM-DD HH24') as time , count(*) from event group by time;
663 :
NAME IS NULL:03/12/29 16:15 ID:SUbPADvC
しいていうなら、0から23までの値を1行ずつ格納した
1列24行のテーブルを作っておいてJOINするとか。
ストアド使えばいいんじゃ・・・。何でもSQL一発でやろうとしない。
substringで頭のほうだけでgroup化できない?
試してないけど。
group by substring(time,from 1 for 8)
みたいな感じで。やってないのでうまくいくかはわからんが
>>666 その香具師です。すんません。シーラカンス本第一版読んでました。失礼しました。
PostgreSQLはちょっとのバージョン違いでそーとー機能変わるからなぁ。
template1 に接続し、pg_database.datname で得られる DB の
テーブル名と、そこに含まれるカラムとそのデータを得る方法はありませんか?
シーラカンス本で思い出したが新版いつでるんだろう。。。
もう第3版が出て2年以上たつけど
本を出すタイミングとしては PITR に対応したあたりが丁度よさそう。
673 :
NAME IS NULL:04/01/01 12:58 ID:yO6vqSyj
Postgreはリカバリ関係はどのように行うのですか?
ロールフォワードって対応されているのですか?
リスタート時のログからのリカバリのredo処理のことなら実装されてるぞ。
WALがあるからにはredo実装しないと意味ないし。
undoは必要ないから実装されてないが。
チェックポイント以前のWALに関しては捨てられる(再利用に回される)から、
PITRには使われてない(PITRが実現されてない)。
詳細は backend/access/transam/xlog.c の StartupXLOG() だな。
678 :
NAME IS NULL:04/01/01 22:36 ID:k6svQpA+
679 :
:04/01/01 22:42 ID:???
>>678 Write Ahead Log
つーか、ぐぐれ。
680 :
NAME IS NULL:04/01/01 22:48 ID:oVaNdYRg
そのredo処理はあくまでもインスタンス障害のリカバリであって、メディア
障害のリカバリではないんだよな。
それも広義のロールフォワードかもしれないけど、ふつうロールフォワードと
いったら、メディア障害に対してバックアップ/アーカイブログからのリカバリ
処理のことを言うと思うが。
ポイントインタイムリカバリというのは、さらに特定のポイントインタイムまでの
ロールフォワードを行うということだから、ちょっと意味合いが違う。
「ロールフォワード」の意味するところって、
チェックポイント以降の更新レコードを
WALを使ってredo処理することだと思うだと思ってますた。
だから、
「リスタート時の自動リカバリ」、
「バックアップ時点から最新状態までの反映(アーカイブログ)」
「それの寸止め(PITR)」
の、どれもロールフォワードだと思ってますた。
682 :
NAME IS NULL:04/01/02 00:31 ID:mdzOBQVK
Kさん 好循環 Aさん 悪循環
(健康体) (喘息)
1.(神が喘息であるかないかを決める)
2.K 喘息でない人 A 喘息の人は
は体力がある 体力がなくなる
3.K A 行動力、
五感(嗅覚)が鈍り感性が変化する
4.K&A 神は異常な感性の人間は本来人に迷惑をかけ
るから外に出てはいけないと思っている。
5.K 変化なし A アトピーになる
6.K 正常な感性 A 外に出なくなりさらに異常な感性になる
7.K 正常な人間 A 異常な人間(レッテル)
683 :
NAME IS NULL:04/01/02 00:31 ID:mdzOBQVK
8.K&A 死
9.K&A 来世
10.K&A 神は異常な人間は人に迷惑をかけるので行動
を抑制する必要があると思っている。
11.K&A 神が喘息であるかないかを決める
12.K 喘息でない A 喘息である
13.K&A 1.に戻る
これは事実。広めようぜ
解決法:寝て起きて、やな気分でも、続けるけること。
体力をつけると感覚が正常に戻り、
アトピーも快癒に向かう。
目安としてグランドを10週くらい。
あとはウォーキング
2.3時間を目安にウインドーショッピングや本屋めぐり
684 :
NAME IS NULL:04/01/02 00:33 ID:mdzOBQVK
(健康体) (喘息)
1.(神が喘息であるかないかを決める)
2.K 喘息でない人 A 喘息の人は
は体力がある 体力がなくなる
3.K A 行動力、
五感(嗅覚)が鈍り感性が変化する
4.K&A 神は異常な感性の人間は本来人に迷惑をかけ
るから外に出てはいけないと思っている。
5.K 変化なし A アトピーになる
6.K 正常な感性 A 外に出なくなりさらに異常な感性になる
7.K 正常な人間 A 異常な人間(レッテル)
685 :
NAME IS NULL:04/01/02 13:22 ID:/PhbzFDe
PostgreSQLはSQLServerなみに使えるんか?
企業でPostgreSQLを使っているとこって結構あるんですか?
( ´д)ヒソ(´д`)ヒソ(д` ) <今時SQLServerだってサ…
( ´,_ゝ`)プッ
688 :
NAME IS NULL:04/01/02 17:21 ID:8W+JCqZ9
>>686 SQL Serverは今時なんだぁ。へぇ〜
685ではない。
SQLServerは別に悪くないと思うけどなぁ。
MS製品でもSQLServerとExcelは悪くないと思う。
あとOEもデフォルトの設定を除けば悪くない。
(ああいう系のメールソフトで、あれ以上のものを見たことない)
ま、いいけど。
で、
>>685 基本的にSQLServer並に使える。
690 :
NAME IS NULL:04/01/03 09:01 ID:W6xNd8e6
最近postgresをいじりはじめたのですが・・・
rootでSSHに入って、
>psql -l
psql: FATAL: user "root" does not exist
と怒られてしまいます。
rootユーザなんて削除してないのに、、、。
ひょっとして、根本的なところで勘違いしてるのでしょうか・・・
どなたか教えていただければ幸いです。
根本的な勘違いをしています。
システムのユーザーと、PostgreSQLのユーザーは違います。
createuserコマンドあたりを見るように。
MS製品で最強なのは
プ ロ ジ ェ ク ト
693 :
NAME IS NULL:04/01/03 12:58 ID:R8QdxRgC
>>685 5W1H が必要なわけよ。
雑誌なり Web を見てご覧。
もりもり PostgreSQL 使われているから。
とりあえず公式サイトを見てみな。まずはそれから。
696 :
:04/01/04 20:20 ID:XHsDwE5w
Kさん 好循環 Aさん 悪循環
(健康体) (喘息)
1.(天国・霊界が喘息であるかないかを決める)
2.K 喘息でない人 A 喘息の人は
は体力がある 体力がなくなる
3.K A 行動力、五感(嗅覚)が鈍り感性が変化する。
4.K&A 天国・霊界は異常な感性の人間は本来人に迷惑をかけ
るから外に出てはいけないと思っている。
5.K 変化なし A アトピーになる
6.K 正常な感性 A 外に出なくなりさらに異常な感性になる。
7.K 正常な人間 A 異常な人間(レッテル)
8.K&A 死 9.K&A 来世
10.K&A 天国・霊界は異常な人間は人に迷惑をかけるので行動
を抑制する必要があると思っている。
11.K&A 天国・霊界が喘息であるかないかを決める 12.K 喘息でない A 喘息である
13.K&A 1.に戻る
これは事実。広めようぜ
解決法:寝て起きて、やな気分でも、続けるけること。
体力をつけると感覚が正常に戻り、
アトピーも快癒に向かう。 目安としてグランドを10週くらい。
あとはウォーキング 2.3時間を目安にウインドーショッピングや本屋めぐり
鼻に変な違和感があったり、気分の悪い時は、
お腹の中の空気を出さなくてはならない。
口をしっかり閉じたまま、口の中に空間を作り、
口の中にできた空気を吐き出す。
これを100回から200回。
>>690 なんにしろ、rootはpgsqlとは一切関わりないようにしといたほうがいいと思うが
699 :
NAME IS NULL:04/01/08 07:36 ID:chRu+yOv
PostgreSQL ODBC ドライバは、ADO 経由で使うと使えるのに、
同じ接続文字列を ADOX の ActiveConnection プロパティに
代入したとたんにエラーになります。
エラーコード -2147352566
理由 Out of present range.
このエラーに関する情報ってなかなか見つからないんですよね。
ADOX で使えたらテーブルの作成とかも簡単にできるのになぁ。
postgresql-7.3.4 を使っています。
しばらくvacuumdb をさぼっていたせいか、1Gbyte くらいのデータファイルが
いくつか出来上がってしまいました。サイズを縮めたいのですが、
max_fsm_pages に1000000000/8192*10 の数値を指定して
vacuumdb -f -a するだけで良いのでしょうか?
マニュアルを読むと、REINDEX じゃないと削ってくれない領域がある
ようにも取れるのですが・・・。
いつも vacuumdb -f -a だけ。
reindex して壊れるわけでもなし、試して結果を公開してよ。
>>701 あう・・ 了解しました。今晩遅くに実行してみます。
704 :
NAME IS NULL:04/01/10 11:18 ID:p5AcCRjd
一度作成したデータベースのエンコードを変更することは
出来ないんでしょうか?
PostgreSQLで、データベースパスワードとpostgres(ルートユーザ)のパスワードのかけ方がわからず、
ネット検索は、断念・・・
Amazon.co.jpで、シーラカンス本を購入・・・
PostgreSQLにもSQLServerのようなGUIマネージャがホスィよ
かといって、Oracleみたいなごちゃごちゃしててわかりずらく、糞重いのは勘弁・・・
709 :
NAME IS NULL:04/01/11 04:56 ID:M1e9HI0k
705
とりあえずwebminからでも操作しろ。
俺はかなり楽になった。
相変わらずテーブルの作成でコケてるが(わかってない)
マシンを買い換えたのでwin版postgresを落としに行ったら
もうダウンロードできなくなったの?
つーか有料版オンリー?
711 :
:04/01/12 00:16 ID:Qdx2iOKd
>>710 Windows だったら MSDE でいいじゃん。
>>712 バカかおまえは。
無料で公開されて居るんだから拾ってきなさい。
>>714 710じゃないけど710の書き込みをみて、ring鯖からcygwin版バイナリが見当たらなかった。
某ネイティブ版はあったけど。
>>715 ソースからじゃまずいのか?
ソースは落とせるだろ
717 :
NAME IS NULL:04/01/12 12:18 ID:go8WkgCe
ぽすげれすきゅーえる なんてやめたほうがいい
SQLサーバDeveloperEditionなら5000円で買えるよ
>>717 実運用は?
DEでも5000円もかかるし。10台にインストールしたら50000円か。
719 :
NAME IS NULL:04/01/13 21:25 ID:OWM2TxrV
アクセスの.mdbをPostgreで使えるようにコンバートする事は出来ますか?
具体的には勉強用にNorthwindを使いたいのです。
アドバイスよろしくお願いします。
720 :
NAME IS NULL:04/01/13 22:29 ID:iZxk1Ltn
CSVにして、インポートとか
ADO通すとか、
いろいろあると思う
721 :
NAME IS NULL:04/01/13 23:49 ID:YQxfit1L
ResultSet rs = db.getResultSet("update hoge set hoge=1 where hogehoge='uma-'");
Javaで上記のようなSQLを発行した場合、何件Updateされたかを
知る方法はありますか?
DBのバージョンは7.3.xです。
>>715 cygwin使ってso-netからpostgresのバイナリ落とせたぞ。
>>721 おまえJavaの勉強し直し。むしろ板違い。
dbってのは何のインスタンスなんだか
725 :
715:04/01/14 08:35 ID:???
>>722 so-netのring鯖みたけど、sygwinのバイナリ見当たらないYO。
いや、まぁ俺はそんなものどうでもいいんだ。
715の時は、
>>710がどのバイナリを指しているかわからない。Win版バイナリといっても、
cygwin用バイナリ。
PowerGres
WinNative版
の3種類あるからな。
726 :
:04/01/14 12:40 ID:???
>>725 ring.so-netからpostgresql 7.4.1-2 バイナリ落とせたよ。
てめえら、素直にsetupでインスコしろよ
えー データベースファイルが肥大したので、vacuumdb -a -f をしたいが、
マニュアルを読むとREINDEX も必要っぽいけど、どうなの??とカキコした者です。
実際にREINDEX を実行してみましたが、ファイルサイズに大きな差は
見られませんでした。しかしながら、vacuumdb -a -f した直後でも
わずかに容量が減りましたので、VACUUM FULL 以外にREINDEX は
必要っぽいです。ほんとにわずかですが。。。
相変わらず1ギガ超のファイルはそのまま残ってました。
こんなに使ってたのか・・・。
>>730 へぇー。勉強になった。
あとはDB内のデータの持ち方だよね。
zipというカラムに「〒123-4567」とあったり、
sexに「男」「女」とあるDBがあった。
zipは「123-4567」、sexは0,1とかすれば小さくなるし。
>>730 >zipというカラムに「〒123-4567」
問題外です
と言いたいが、実際そういうの多いよな
男・女はどうして、付け合わせるパワー(時間)がもったいないから
正規化しないということはあるよね。
〒123-4567は問題外。
733 :
730:04/01/15 17:21 ID:???
>>731 多いよー。
そこは数万件たまった Access を PostgreSQL に移行する仕事。
都道府県で集計取りたいというのに zip と address しかカラムがなくて address は
札幌市...
北海道札幌市...
東京都港区...
中央区...
みたいに都道府県ありなしがバラバラ。
電話番号も 03-1234-5678(内線5), 03(1234)5678(○○様) とか文字入り&フォーマットばらばら。
各地の支店の人がエラーチェックなしのフォームに思い思いの入れ方してたからね。
734 :
730:04/01/15 17:23 ID:???
>>732 駆け出しのころ、郵便番号は 3 桁と 4 桁の必須チェックをして
海外の zip が入らない、というミスをしたなぁ。
>>733 どういう項目が入力されるのか(必要なのか)の検討が甘かったということだろうね。
内線や担当者のコラムを持つべきだったとか、都道府県名は別コラムとかね。
でも往々にして甘くなるんだよなあ・・・
それに後から集計単位が追加されることもあるから一概に責められない。
というか、責めないでくれ頼むから(泣
正規化しすぎたために、left join をしまくらないと名称が持って来られなくなってしまい
テーブルのエイリアスをAから順につけてSまで行ったときは嫌になった。
737 :
730:04/01/16 11:44 ID:???
>>735 うむ。責められない。
会社の合併や市町村統廃合、姓と名を各40byteにしていたら
インド人の名前が入らなかったり、といろいろ経験しないと見えてこないよね。
>>736 エイリアスを a, b, c や t1, t2, t3 とかよく見るけど、
せめて 2, 3 文字の意味ある名前にしてほしいな。引き継いだ時の保守が楽になるので。
例えばテーブル名 customer を a や t1 ではなく cu、position を pos など。
t1 〜 t23 までのを見たことあるよ。
>>737 >インド人の名前が入らなかったり
名前にシングルクォーテーションがある人のことなんて普通考えないしね。
Del'Angeloさんにはまいったよ(外資系じゃなかったし)。
ま、これはテーブルの設計じゃなくてInsert文を作るルーチンが悪かったんだけど。
>せめて 2, 3 文字の意味ある名前にしてほしいな。
これはやるだけで全然違うよね。どのテールブルを指してるのか
想像しやすいし、複数の問い合わせ(ビューでも)で名前が統一される
ことにもなるし。
>>737 「テーブル名は全て『○○TBL』」「○○は五文字以内」という規約があり
「○○」部分をローマ字の母音抜きで表す、たとえば
「取引先テーブル」を「TRHKSTBL」とかつけられてる
そんなテーブルばかりだと
そんな気力はなくなります
かしこ
740 :
735:04/01/16 15:08 ID:???
>>739 確かにそういう規約もあるなあ。
コラム名も全部頭からの連番(c001,c002とか)で、
テーブルが変わると同じ項目でもコラム名が変わっちゃうし
対応表がないと何がなにやら分からんしで、大変だった覚えがある。
741 :
730:04/01/16 16:44 ID:???
>>738 ' が問題ではなく 40byte 以上の名前だったのです。世界は広い。
>>739 会社独自の変態コーディング規約は困るね。
20年前じゃないんだし、変に略したりケチるのは害悪ですね。
ただ、そんな我社も text 型が使えない。
Oracle や SQL Server への移行の可能性を考えて varchar のみ。
742 :
735:04/01/16 17:44 ID:???
>>741 >' が問題ではなく 40byte 以上の名前だったのです。世界は広い。
ごめん、自分の失敗のことしか頭になかった。
>>739-740 激しく同情
xxx_ID, xxx_CD, xxx_CODE, xxx_NO, xxx_NUM
とかごちゃまぜになったりとかは見かけるね。
コーディング規約はよく見かけるけど、
テーブルやフィールドの命名規則って見かけないもんなぁ。
PostgreSQL は _idx や _seq, p_ なんてのを付けるね。
>>743 金融とか証券とかは多いよ>テーブルやフィールドの命名規則
ふた昔も前のメインフレームを殺せないからそうなっちゃうんだけど。
>>745 >ふた昔も前のメインフレームを殺せない
というよりもそれに馴染んだもと開発者どもが譲らないんだよな。
ああ、それを「殺せない」って書いてるのか。
保守
「スキーマ」は具体的にどういう時に使うと便利なんでしょうか。
>>748 お金が無くて、テスト機を用意できないとき
>>748 アクセス権限のコントロール、、、ぐらいしか思い浮かばない。
>>748 基本的には別システムを構築するんだけど、
場合によっては連係が必要な場合があるときに便利だと思うよ。
DBを分散させちゃうとトランザクションとかややこしいことになるしね。
もちろんメリット・デメリットがある話だから良く考える必要あるけど。
752 :
750:04/01/21 23:27 ID:???
>>751 日本語がわかりづらかった。
一行目
「基本的に、別システムなんだけど、」
>>748 あるいは、テーブルの所属を明確にするということかな。
サーバは1台でもアプリは複数あるかもしれないし、
アプリが1つでも日替わりデータとマスタを分けた方がいいこともあるだろう。
偉そうなことを書くけど、そこにある機能をどう使うかだと思うよ。
お勉強用サーバならお勉強する人の名前を付けるのもすごく便利。
スキーマ変えると、プログラムの中に書いてるSQLも修正しなくちゃいけなくなるから
それだったら全く同じテーブルを用意したデータベース一個作っちゃった方が楽なんだよね。
データベース変えるだけなら接続先情報変えるだけで済むし。
>>754 そういうあなたのためのSET search_path TO hoge
>>755 だから、それじゃだめだろ
複数のチームがそれぞれ別のデータでテストしたい場合はどうすんだよ
チームAは1000000件のパフォーマンス調査
チームBは○○機能の結合テスト(専用データ)
チームCは××機能の結合テスト(専用データ)
チームDはモジュール単位の不具合対応(単体テスト用データ、整合性考えずに手動でどんどん動作確認用データ追加)
こういうときがあるから
>>756 ああ、そういう場合か。
そういう場合はDB分けた方がいいね。
そういう用途にスキーマ使うのはなんか違う気がするし。
俺が言いたかったのは
>>751のケースでした。
失礼しました。
>>754 もちろん、設計段階でそういう構造にするべきだろうね。
途中から変えるのは大変だと思うよ。
>>756 そういうときは(スキーマとかにとらわれず)そういうときに応じたものを作るべき。
俺が
>>753で書いたのは「こういう使い方もできますよ」ということね。
だから「こういうときにはそれじゃだめ」といわれても困るよ(w
繰り返すようだけど、ある機能があったら、それをどう便利に使うかと
どういうときに使うべきではないかを考えるのが吉じゃないかな。
スキーマという機能はどんなときに使えるかということに皆答えてるわけだから
個別のケースは抜きにしたい。
760 :
753:04/01/22 02:56 ID:???
ごめん・・・
やだね
深夜に急に活発だな。
3人はいそうだ。
すいませんすべて自演でした
764 :
753:04/01/22 03:06 ID:???
実際何人いるんだ?
765 :
753:04/01/22 03:17 ID:???
僕一人ですけど、一応質問してみました。
スキーマのアドバイスをした人二人と、
なんか勘違いな反応をした人一人と、
少なくとも三人はいるな。
もう、寝たかもしれんが。
767 :
753:04/01/22 03:35 ID:???
770 :
748:04/01/22 09:49 ID:???
スキーマの元質問者です。イメージが掴めました。ありがとうございました。
マジか
772 :
NAME IS NULL:04/01/25 00:23 ID:IMLQDJ4u
列の領域を拡張したいんだけど、
やり方がわからん。
>>772 psqlで
\h alter table
してみよう。
774 :
NAME IS NULL:04/01/26 18:53 ID:05VDMtbF
データベース内の一つのテーブルだけを、
pg_dumpのようにバックアップ取りたいんですけど方法はありますか?
775 :
NAME IS NULL:04/01/26 19:06 ID:kvn9DY8q
pg_dump -t
776 :
774:04/01/26 20:29 ID:05VDMtbF
thx
他のユーザーにDBのすべての権限を与えるにはどうするの?
table毎とかしかやり方が見つからない
>>777 ないね。grant all on * to user できるといいのに。
779 :
NAME IS NULL:04/01/27 22:06 ID:l591xAXQ
MD5ハッシュ値とかの、多バイトデータって皆さんどうやって格納してらっしゃるんですか?
781 :
NAME IS NULL:04/01/27 22:38 ID:l591xAXQ
>>780 げ、やっぱりそうなんですか…
128ビット整数とかの型はないんですか?
>>781 お前さぁ、仮にそれがあったとして、効率いいと思う?
まぁ試しに number とか使ってみたら?
配列を含むカラムを group by したいときはどうすればいいですか?無理ですか?
設計が糞
配列型を使ったことないけど、
Web のチェックボックスのデータを格納するのにいいなぁ、と思ってる。
使っている人いる?問題点があれば聞きたい。
別テーブルにすればいいのに
>>785 group by できない
ただ、別に配列の要素を個別に取り出すということをしないのなら text でも充分
>>786 create table parent (
id serial,
attr int[]
);
create tabel child (
child_id serial,
parent_id int,
foreign key (parent_id) references(parent, id)
);
みたいなテーブルがあって、parent の一覧と、それにぶらさがる child の数を出したいんです。
select p.id,p.attr,count(c.child_id) from parent p left outer join child c on c.parent_id = p.id group by p.id,p.attr;
やっぱ配列使った時点でマズーだったですか?
多分ね。
790 :
NAME IS NULL:04/01/30 20:37 ID:40bIuutY
7.4系使ってると、普通User認証ってMD5使うよね?
もちろん7.4.1のJDBCドライバってMD5暗号化に対応してるよね?
なにせ、俺には確認する技術が無いため、ちょっと不安です。
791 :
NAME IS NULL:04/01/31 08:03 ID:0XWRRZlI
INSERT されたときの serial の値を取得したいのですが、どのような方法がスマートでしょうか?
LOCK
INSERT
SELECT currval('hoge_seq');
くらいしか思いつかなかったけどこれでいいのかしら....
>>791 insertしたレコードのoidを取得して、select
漏れは
$seq = SELECT nextval('t1_hoge_seq');
してから
INSERT INTO t1 (hoge) VALUES ($seq);
ってやってる。
794 :
:04/01/31 16:31 ID:???
>>791 ふつー SELECT currval('hoge_seq');
so-ka?
gakkai?
senbei?
798 :
NAME IS NULL:04/02/01 12:49 ID:n6BRvHRb
SELECT * FROM table WHERE fname = 'あああ'
とやると fname に全角 3 文字が入力されている全てのレコードが出てきてしまいます。
SELECT * FROM table WHERE fname LIKE 'あああ'
ならば fname が 'あああ' のレコードのみ取得できます。
こういうものなのでしょうか?
ちなみに fname の属性は以下のとおりです。
fname | character varying(256) | not null
Indexes: table_fname_idx btree (fname)
バージョン
fedora-1
postgresql-7.3.4
char型の配列で定義されてる列の末尾にデータを挿入したい場合って
何かスマートな方法あります?
SELECT array_dims(hoge) FROM mytable;
して返ってくる値は 1:50 のようにコロンで区切られてるので、そいつを分解して
50 に 1 を足してそこに挿入。としてるんですが。。
俺なら文字列を分解しようとせず、カラムを分解する。
唐突で申し訳有りませんが
Windows上で動くPostgreSQLはいつごろ出て来るのでしょうか。
誰か、SFUでPostgreSQLコンパイルした香具師いないの?
803 :
NAME IS NULL:04/02/01 18:33 ID:jqi2fyXh
postgres7.1 を使用しています。
テーブル作成後にカラムに not null を設定したいのですが、
ALTER TABLE で default などは設定できるのですが、
not null が設定できません。
どなかた教えてください。
何か、.....な輩が混入してるな。
ポスグレファンよ、自由を守ろう。
無理。
>>803 別にpostgresは関係ない。SQL勉強しろフンカス
あえてPostgreSQLと言うなら、\h ALTER TABLE
あるテーブルのレコードの保存件数をMAX10件にして、
11件目が登録されたら一番古いレコードを消したいのですが、
SQLでどうあらわせばいいのでしょうか?
新しい順で10件目以降をとってくるSELECT文とLIMITの組み合わせだとは思うんですが…
ちなみに insert する時はデフォルトで CURRENT_TIMESTAMP を update項目に入れてます。
すいません、意味わからなかったですね。
id | update
--+------
int| timestamp
のテーブルがあるときに、
update の新しい順で、10件以降をSELECTしたいです。
10件であれば、
select * from table order by update desc limit 10;
でいけるんですが、
10件目以降というのはどうやって表現していいのか悩んでます。
810 :
808:04/02/01 19:37 ID:???
offset っていうのがあったんですね・・・すいません解決しました。
Postgresで年間2000万〜3000万件ほどレコードが入るシステムを運用しています。
過去データはそれほど必要ないのでdeleteして800万件。
data領域をduでみると12GB程。数時間かけてvacuumdb -fしたら8GBになりました。
しかし、データベースをdropしてdumpデータからインポートしてみたら3GBにしか
なりませんでした。dumpファイルは800MBちょいです。
過去データを定期的に削除しながら運用しているのですが、Postgresでは
不要な領域を綺麗に削除するには一度DBを止めるしかないのでしょうか。
インポートには30分くらいですが、それでも保守チームに手順書提出して
定期作業として組み込んでもらわないといけなくなるので面倒だなあ・・
(スクリプトでもできるけど途中で失敗したときのことを考えると、
drop-importは手動じゃないと不安)
#そもそもそんなシステムにPostgres使うなっていう突っ込みは無しの方向で
そもそもそんなシステムにPostgres使うな
813 :
811:04/02/02 00:30 ID:???
>>812 ありがとう。愛を感じたよ。
DBを決めた無能管理者が偏屈でさあ。DB代ケチるより遊んでる外注を
一月早く切ればOracleSEのCPUライセンスが買えるのにね。
あのぅ…現在接続中のクライアントのIPアドレスを得る関数なんて…
ないですよね…
>>814 Oracleならあるんだけどねえ。
pg_XXX,pga_XXXのテーブルを覗いてみたけどそれらしいものも無し
816 :
811:04/02/02 01:12 ID:???
ついでにグチらせて
おれこのシステムの担当じゃなかったんだけど、あまりに更新が遅くなって
借り出されたんだわ。担当のやつじゃ手に負えない程ひどいソースだったから。
元外注が作ったプログラムが駄目すぎで整理したらソースのサイズは半分くらいに
なった。まだ無駄が多いけど最大のボトルネックはやっつけたし大分サクサク
動くようになった。2日で直せって言われてたからこれ以上時間かけらんないし。
あーなんだPostgresでも結構いけそうだなあというのは実感としてあるんだけど
環境周りもしっかりしてくれたらなあ。
>>815 ですよねぇ。せめて環境変数にでも設定してくれれば方法もあるんですけどねぇ…
残念ですが、他の方法を考えることにします…
>>817 アプリ経由で接続させてるなら、セッションテーブル作ってログイン時に
書き込むようにすれば管理できるよ。psqlでの接続も監視したいっていうなら
無理だけど
>>819 アプリというのはWebアプリという意味ですか?
でしたら残念ながらWebじゃなくてWindowsから直接なんです(libpq.dll使用)。
>>820 >>819じゃないけど。
別にWebアプリじゃなくても、動いてる端末のIPを取得できれば
それを書き込めばいいんじゃない?
サーバ側じゃなくてクライアント側で書き込むということね。
つまり、作るアプリにそういう機能を持たせるってこと。
おはようございます
>>821 LAN内なんですよ(サーバは外)。
プライベートなアドレスもらってもあんまり嬉しくないもので…
>>822 ああ、なるほど。
じゃ、ルーターなりなんなりにIPを問い合わせるか、サーバ側にもアプリを置くか
しかないかな・・・
>>823 WindowsからグローバルIPを調べるのはちょっと難しいですねぇ。
仕方ないので http で PHP を叩こうかと思っています。
>>824 自分がどの postmaster かわかんないですよね。
できれば仮に remote_addr() という関数が用意されてたとして、
INSERT INTO t1 (atime, remote_addr) VALUES (now(), remote_addr());
みたいなことができれば一番いいんですが…
あるファイルのパスが格納されるテーブルがある時に、
そのテーブルのレコードを削除すると、自動で、
ファイルのパスを見てそのファイル自体も削除させることってできまつか?
>>826 トリガとプロシジャを書けばいいんじゃない。
>>828 ありがとうございますー。
トリガでシステムコマンドは使えるのでしょうか?
ちょっと調べてみまつ。
>>829 ファイルを消す権限が問題になるかもね。
ファイルを消してから該当レコードを消す、という方法なら簡単そう。
>>277 ワラタ
ところではなしは変わるけど、携帯ゲーム機"プレイステーションポータブル(PSP)
久夛良木氏は,“PSPはゲーム業界が待ち望んだ究極の携帯機”として説明。「ここまでやるかと言われるスペックを投入した」という。
発表によれば「PSP」は,曲面描画エンジン機能を有し,3Dグラフィックでゲームが楽しめる。
7.1chによるサラウンド,E3での発表以来,クリエイターたちにリクエストが高かった無線LANも搭載(802.11)。
MPEG-4(ACV)による美しい動画も楽しめるという。これによりゲーム以外の映画などでのニーズも期待する。
外部端子で将来,GPSやデジタルチューナーにも接続したいとする。
また,久夛良木氏は,繰り返し「コピープロテクトがしっかりしていること」と力説。会場に集まった開発者たちにアピールしていた。
さらに,ボタン設定なども明らかにされ,PS同様「○△□×」ボタン,R1・L1,アナログスティックが採用される。
この際、スク・エニもGBAからPSPに乗り換えたらどうでしょう。スク・エニの場合、PSPの方が実力を出しやすいような気がするんですが。
任天堂が携帯ゲーム機で圧倒的なシェアをもってるなら、スク・エニがそれを崩してみるのもおもしろいですし。かつて、PS人気の引き金となったFF7のように。
突然変な事いいだしてすまそ‥
GBAとくらべてみてどうですかね?シェアのことは抜きで。
皆さんどうですかね?
>>811 max_fsm_pages が足りてない為に大きいファイルが処理されなかった、
って可能性は無いですか?
835 :
811:04/02/03 22:53 ID:???
ちょっとmax_fsm_pagesについて調べてみました。
vacuumdb -f でも領域が小さくならなかったから、max_fsm_pagesじゃなくて
indexの肥大化だったのかなあ。数百万件ずつdeleteしてたし
836 :
NAME IS NULL:04/02/04 00:30 ID:fFY5eBen
>808
create or replace function の中でINSERTとDELETEを実行してみよう。
相手すんなよ糞が
>>801 SRA が PowerGres という商用版を出してるし、
それの元になったのもあるし、
cygwin は不安定ながら 7.4.1 も出てるし、
本家も 7.5 で Windows ネイティブ対応されるかも。
PostgreSQLは無料で使えるから良いのであって
金払わなきゃいけないのならMySQL使います。
それならMySQLをお使いになるのがよかろう。
「金払わなくてもいい」ソフトはいくらでもあるよ(w
>>840 金を払いたくないのにOSはWindowsなんですね。
金は払いたくないし苦労もしたくないんじゃ
何使っても結果は同じじゃないか?
844 :
NAME IS NULL:04/02/09 17:10 ID:WTc6t5Mn
結局7.4でWindowsネイティブ対応の話はなくなったの?
やる人がいないから、という所だよね。
SRA の人たちが PowerGres の知見を活かしてくれるといいのだけど。
って PowerGres は使い物になるんですかね?
846 :
NAME IS NULL:04/02/09 18:00 ID:NBLSvdEs
>>842 Windowsなんてピーコでどっからでも手に入りますが、何か?
やれやれだな。
848 :
NAME IS NULL:04/02/09 20:01 ID:p8BdgULW
PostgreSQLとMySQLはどっちが安定してるの?
なにするかによるんじゃない?
848のような質問するレベルの人が使う範囲では、どちらも安定してる。
同感。なのでトリガ&プロシジャを使うか、
ライセンスは大丈夫か、じゃないかな。
851 :
NAME IS NULL:04/02/11 18:55 ID:zYAvEpnO
あるスキーマに
user1
user2
user3
....
というテーブルらがあるのですが、
select count(*) from user1;
select count(*) from user2;
select count(*) from user3;
....
を どうすれば view などにできますか?
union
とりあえず一発で持ってきたければ
select * from
(select count(*) as count1 from user1) user1,
(select count(*) as count2 from user2) user2,
(select count(*) as count3 from user3) user3
だけどビューにしたかったら適当にやって
854 :
Posgre初心者:04/02/11 21:21 ID:FUtlNjt5
現在 Windows2000 SERVER 上でPostgreSQLを動作させる為にソフトのインストールを行っています。
cygwin 2.416
cygipc 1.14
postgresql 7.4.1
を使用しています。
Windows2000 PRO では問題なくインストール出来て動作していますが
Windows2000 SERVERだと initdb -E EUC_JP を実行した時
fixing permissions on existing directory /usr/local/pgsql/data... ok
creating directory /usr/local/pgsql/data/base... ok
creating directory /usr/local/pgsql/data/global... ok
creating directory /usr/local/pgsql/data/pg_xlog... ok
creating directory /usr/local/pgsql/data/pg_clog... ok
selecting default max_connections... 10
selecting default shared_buffers... 50
creating configuration files... ok
creating template1 database in /usr/local/pgsql/data/base/1... FATAL: could not
create shared memory segment: Function not implemented
DETAIL: Failed system call was shmget(key=1, size=1081344, 03600).
と言うエラーが出て失敗します。
initdb を行う前にipc-daemon2 & も実行していてタスクマネージャーのプロセスで
起動しているのは確認できています。
またipc-daemon2 & を実行していなくても同じメッセージでエラーになります。
cygipcの設定等でSERVER用に何かあるのでしょうか?
同じ方法でインストールした2000PRO(プロフェッショナル)では問題ないので
困っています。どなたか判る方いませんでしょうか?
855 :
Posgre初心者:04/02/14 20:34 ID:K8DOvVy5
自己レスです。
cygwinのバージョンがWindows2000 SERVERが1.5.7、
Windows2000 PROが1.5.5でした。
一日違いのインストールで何故Windows2000 SERVERが1.5.7で
Windows2000 PROが1.5.5になってしまったかは分かりません。
ただWindows2000 SERVERにcygwin 1.5.5をインストールすれば
問題なく動作しました。cygwinはsetup.exeでインストールしているので
自動で最新がインストールされていると思っていたのですがどうも
Windows2000 PROでインストールした時は1.5.5が入ったようです。(何でだろ〜???)
cygwin 1.5.7 では何度再インストールしてもinitdbはやはりエラーになります。
ipcsでも共有メモリ等が設定できていませんでした。(ipc-daemon2 &は実行済み)
と言うことでcygwin を1.5.5で運用します。
あるカウント以上のデータだけを、ランダムに抽出する
やり方を教えてください。
いみがわかりません。
>>856 SELECT * FROM hoge WHERE count >= あるカウント AND PKEY = RAND();
859 :
NAME IS NULL:04/02/17 02:03 ID:0sybohhD
PGCluster をまともに動かせてる人いてますか?
1.0.6b
>>859 途中でキューにたまるんだか、すぐに整合性取れなくなるな
ある二つのテーブルに対して、下のようなSELECT文を発行しています。
(正しいSQL文ではないです。雰囲気をわかってもらえれば。。)
SELECT DISTINCT a.a, a.b, a.c, a.d, a.e, a.f, a.g, a.h
FROM table_a a, table_b b
WHERE
( a.cd1 in ('1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16') ) AND
((( b.code2 in ('1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16') ) AND a.code2 = b.code2 ) OR ( b.code in ('1','2','3','4','5','6','12','13','14','15','16','22','22','24','25','26')))
このSQLだと、検索に8秒ほどかかってしまいます。
また、単純に in句のワードが増えると、検索速度も比例して増えてしまいます。
どうにかしてスピードアップを図りたいのですが、何か良い置き換えかなんかありますか??
>>861 EXISTS を使うように書き直すと良い。
雰囲気だと言うのでちゃんと書き直してはやらんけど。
Postgresには、MySQLのtimestampのような
データ操作の日時を自動的に記録する特別な型や方法ってありますか?
MySQLみたいにTimistampが使える。
はず。
ん〜PostgresとMySQLではtimestampの性格が違うくないですか?
cast( current_date as date ) || ' ' || substring( cast( current_time as char( 14 ) ) from 1 for 8 )
って感じじゃだめ?
だめよ
plpgsqlでファンクション作ったんだが、
CREATE FUNCTION〜〜のコード書いたファイルをなくしてしまった。
Oracleでストアドの内容見たければ
select text from user_source where name = 名前 order by line
で確認できるけど
PostgreSQLで見る方法ってある?
もう一度書くと手間がかかるから出来れば拾い出したいんだけど。
select * from pg_proc;
870 :
868:04/02/19 18:30 ID:???
>>869 うわ、すごい単純。もうちょっとぐぐれば見つかったかもしれんね。
ありがとう。探し方が下手ですまんかった。
毎日の平均気温を記録したテーブルがあるとします。
ここから、今月の平均と、年間の平均を一行で取ってくることってできますか?
SELECT avg(気温) AS 月平均 FROM テーブル WHERE 記録日 = 今月;
と
SELECT avg(気温) AS 年平均 FROM テーブル WHERE 記録日 = 今年;
をまとめて一行で、という感じなんですけれども。
select a.kuso, b.unko from
(SELECT avg(気温) AS kuso FROM テーブル WHERE 記録日 = 今月) a,
(SELECT avg(気温) AS unko FROM テーブル WHERE 記録日 = 今年) b
873 :
871:04/02/20 23:46 ID:???
なるほど、でもそれってひょっとして例えばPHPから
$monthly = $db->getOne($SQL1);
$yearly = $db->getOne($SQL2);
とやるのとあんまり変わらなかったりしますか?
PHPは不勉強で分からないんだけど、その文だとDBへのアクセスは
2回になるんじゃない?
>>872の文ならアクセス自体は1回で済むよ。
875 :
871:04/02/21 10:36 ID:???
>>874 もちろんそうですが、サブクエリってDBに取ってはあまり嬉しくない、
と聞いたことがあるもので、これだけのためにサブクエリを二つも
発行するのなら、シンプルなもの二回の方が効率がよいのかなと
思ったのです。
それは環境によるんじゃないかな。
DBがいっぱいいっぱいなら2回に分けた方がいいかもしれんし、
ネットワークがいっぱいいっぱいならサブクエリでも1回ですませた方が
いいと思う。
ただ、この程度(
>>872のSQL)ならどっちでも大して変わらないような気がする。
>>875 最初に「まとめて一行で」って要件出したのおまえだろ、
確実に要件を満たした回答の後でぐだぐだ言われてもな…
878 :
875:04/02/22 12:28 ID:???
>>876 なるほど、よくわかりました。もう少し検討してみます。
>>877 おっしゃる通りです。すいません。
>>872はネタ的解と思っていたのだが、マジレスだったと。
kuso,unkoっていう部分は本音だよ
Table "public.tankamaster"
Column | Type | Modifiers
--------------+---------+------------------------------------------------------------------
tankaid | integer | not null default nextval('public.tankamaster_tankaid_seq'::text)
body | text |
note | text |
publish_date | date
という単純な表で、
月ごとにレコード数を表示させる以下のSQLはうまくいくのですが・・・
select
TO_CHAR(publish_date,'YYYYMM') as publish_yyyymm ,
count(*) as publish_yyyymm_count
from tankamaster
group by publish_yyyymm
order by publish_yyyymm
「where句にpublish_dateが2003年だったら」
という書き方がわからず困ってます。
where TO_CHAR(publish_date,'YYYY') = '2003'
とかやったのですが、エラーでした。
どのようにすれば実現できるのでしょうか?
どなたか、教えて頂ければ幸いです。
883 :
882:04/02/23 09:59 ID:WjXYrXD4
うーん、age
884 :
875:04/02/23 10:05 ID:???
date_part()/extract()
dete_trunc()
885 :
882:04/02/23 11:20 ID:WjXYrXD4
>>884 ありがとうございます。
ただ、「where date_part('year',publish_date) = 2003」を前述(
>>882)のSQLにくわえても、
えらーになってしまいます。
ただ、
select publish_date
from tankamaster
where date_part('year',publish_date) = 2003
だと当然うまくいきます。
groupby や order byが絡んでだめになってるんでしょうか?
でもいろいろ部分的に削っても、実現できず。。。
SQL的に、矛盾したことはやってないですよねぇ。。。
886 :
875:04/02/23 11:31 ID:???
having
887 :
882:04/02/23 17:33 ID:WjXYrXD4
select
TO_CHAR(publish_date,'YYYYMM') as publish_yyyymm ,
count(*) as publish_yyyymm_count
from tankamaster
group by publish_yyyymm
order by publish_yyyymm
having date_part('year',publish_date) = 2003
でもえらーがでます。。。_| ̄|○
で、そろそろそのエラーの内容は晒してくれるんだろうな
group by TO_CHAR(publish_date,'YYYYMM')
ではだめ?
#group byって別名使えたっけ?
#良く覚えてない&試してないで申し訳ないが。。。
890 :
882:04/02/23 18:22 ID:WjXYrXD4
>>888 すいません、単純ミスかと思ったので、みなさんならすぐわかるかと思って。
>>889 select
TO_CHAR(publish_date,'YYYYMM') as publish_yyyymm ,
count(*) as publish_yyyymm_count
from tankamaster
group by publish_yyyymm
order by publish_yyyymm
group by TO_CHAR(publish_date,'YYYYMM')
とやったら、
parse error at or near "group" at character 169
でした。。。_| ̄|○
select
TO_CHAR(publish_date,'YYYYMM') as publish_yyyymm ,
count(*) as publish_yyyymm_count
from tankamaster
group by publish_yyyymm
order by publish_yyyymm
で普通にOKだろ。なぜ2つもgroupがある。
select
publish_yyyymm,
count(*) as publish_yyyymm_count
from tankamaster
group by publish_yyyymm
order by publish_yyyymm
group by TO_CHAR(publish_date,'YYYYMM') as publish_yyyymm
だとだめ?
group byしてるわけだから、select句には別名を書かないとマズイと思ったんだが。
#申し訳ないけど、テストしてない
893 :
892:04/02/23 18:31 ID:???
たしかに、group by句が二つある・・・
一つにまとめてくれい。
894 :
892:04/02/23 18:33 ID:???
よく考えたら別名をつける必要はなかった気がしてきた・・・
895 :
882:04/02/23 18:40 ID:WjXYrXD4
>>891-893 すみません、コピペみすしてました。
やりたいことは
select
TO_CHAR(publish_date,'YYYYMM') as publish_yyyymm ,
count(*) as publish_yyyymm_count
from tankamaster
group by publish_yyyymm
order by publish_yyyymm
where date_part('year',publish_date) = 2003
(publish_date列が2003年のレコードの中で、月別にまとめてソートして、月別件数表示する、というものなのですが。
で、上記SQLだと、「parse error at or near "where" at character 157」と言われてしまいます。。。
まずはSQLの文法を勉強してください
馬鹿に付ける薬はないな。
_| ̄|○ そんなオチだったのか。。。
オ〜チ〜チ〜オ〜チ〜
氏んでるんだろうか〜
順番
901 :
882:04/02/24 11:52 ID:???
すいません、わかりました。勉強しなおしてきます。。。。_| ̄|○
>>901 気にするなよ。最初のうちはそういうもんだ。
勉強して、このスレでレスするようになってくれ。
全体的にこのスレって優しいよな。
Windows版PostgreSQLまだぁ〜?
ある
はい次
Powergresとか言うなよ厨房?
はいはい。Win厨はどっかいってねー
Win版も見つけられずCygwinも入れられないヘタレは
ODBCでテキストファイルでも使ってればぁ?
てゆーか何故にWin32でポスグレ?
漏れって、ポスグレを使いたくてUnix(Linux)をやり始めたようなもんだ。
CygwinもUnixの経験がまったくないと、サパーリだったし。
で、あっちゃこっちゃの鯖はLinuxって感じになってしまったが、
KDEとかGNOMEに触れた時は、Winの呪縛から逃れたい気も手伝って
いろいろ弄ったけど、結局クライアントはいまだにWindows。
スレ違いスマソ
聞きかじりだろ。
どうせこの程度の奴が使う分には、MySQLどころか
Accessでも充分事足りるんだよ
でも「みんながpostgresの方が良いとか言うから」とか
「2chのあるスレでの比較によると…」とか、そんなん。
CREATE TABLE する時に、とあるカラムの値が指定値のときに UNIQUE、
なんて制約を定義することはひょっとしてできないのでしょうか?
CREATE TABLE t1 (
flag INT,
code INT,
CHECK (UNIQUE(code) AND flag > 0)
);
みたいなことができればいいのですが。。。
それ全然uniqueじゃないよ。
918 :
916:04/03/09 22:04 ID:???
>>917 正確には unique じゃないのはわかります。
とりあえず flag の値を変更するときに、別の bool のカラム(例えばf2)に
flag > 0 の結果を格納するようにすれば、
UNIQUE(code, f2)
で同様の制約をかけれることは気付いたのですが、
あまりスマートじゃないですよね。。。
いい方法はないでしょうか?
919 :
NAME IS NULL:04/03/13 01:07 ID:SQZ4DqSr
7.4.2へ入れ替え中
トリガ使え
7.3.6 に入れ替え中。
根拠なしに 7.4.3 になったら移行しようと思ってる。
・ニ。シ・ヨ・?、ホタ゚キラ、ホコン。「VARCHAR、ネTEXTキソ、ホサネ、、ハャ、ア、テ、ニ、ノ、ヲ、キ、ニ、゙、ケ?
923 :
922:04/03/14 15:56 ID:???
、ケ、゚、゙、サ、クサイス、ア、゙、キ、ソ。」P2、ホトエサメ、ャ、隍ッ、ハ、、、ハ...
・ニ。シ・ヨ・?タ゚キラ、ホコン。「VARCHAR、ネTEXTキソ、ホサネ、、ハャ、ア、テ、ニ、ノ、ヲ、キ、ニ、、、゙、ケ、ォ?
チエノEXT、テ、ニ、荀?ハ�、マ、タ、皃ヌ、キ、遉ヲ、ォ?
924 :
922:04/03/14 15:59 ID:???
また化けた。スレ汚してすみません。逝って来ます...
で、Windows版はまだぁ?
うんこ
教えてください
7.4は自動的にVACUUM する機能はついているのですか
ドキュメントを見ている限りでは付いて無さそうなのですが?
ありがとう
次のバージョンにずれたのですね
ちょっとお尋ねしますが、変なクエリを発行してしまって帰ってこなくなった
postmaster を強制終了する方法ってあるんでしょうか?
kill postmasterのPID
でも大丈夫なんでしょうか?
931 :
NAME IS NULL:04/03/15 20:48 ID:3isCxXIL
7.4.2をDLしてpostmaterしようとすると
FATAL: "/usr/local/pgsql/data" is not a valid data directory
DETAIL: File "/usr/local/pgsql/data/PG_VERSION" is missing.
なるエラーが出てしまいます。
無難に7.3あたりにした方がいいのでしょうか?
>929
contrib/pg_autovacuum/
>>932 感謝します。
contribディレクトリのこと調べてみました。
こういう形でユーティリティが提供されているとは知りませんでした。
makeしないといけないのですね
Windows版はまだぁ?
>>935 前から聞いてる人?
おいらも同じ気分
雑誌によると7.5またわ8.0らしい
PostgreSQLと相性の良い文字コードはEUC-JPですか?
UTF-8やShift-JISでも使えますけどなんか無駄な機能を使っているような気がします。
alterで型をintからtextに変換することはできますか?
急に文字入れたいとか言われちゃって・・・
939 :
938:04/03/19 16:55 ID:???
言ったそばから自己解決しました><
新しいカラムを追加して、そこに変換したいカラムのデータをコピーして
古いカラム消して、新しく追加したカラムの名前を古いのに変えれば
同じでした。
postgresqlでクエリのベンチマークを測る手段としてpgloadを使ってみたいんですが
もう古いのか、いくつかエラーが出るんで修正しながら試しています。
ベンチマーク測定で他に何か良い方法ってありますか?
(pgbenchはマニュアルを読みましたが、既存のテーブルのテストはできないですよね?)
単純に時間をはかるだけなら、psqlから\timingするというのもある。
MLより、こっちのほうが建設的に見えるのはどういうわけだ?
MLにはジンナイタソに
「そろそろモモコの一周忌ですね」
とツッコメる人がいないからだ。
>>943 モモコってなんですか?
ハムスターかなんか?
みんな仲良く!
>>946 なるほど、技術系ML各地で電波を送信している方なのですね。
名前をぐぐってみたらわかりますた。
>>948 えっ?これもジンナイタソの自作自演なの?((((;゜Д゜))))ガクガクブルブル
>>948-949 もういいよ、ジンナイタン、そこまでジサクジエーンしなくても。
みんなわかってるから…。
>>948=ジンナイタソ
ちなみに943がモモコの夫の雅人で944がゆっぴいということでよろしいか?
>946
死亡メールにマジレスしてる人がいることも驚きダ!
スレタイは
「PostgreSQL & pgsql-jp ML 3テーブル目」
でおながい
>>952 そして今ジナイタソの相手してる人をみると・・・
956 :
NAME IS NULL:04/03/20 17:22 ID:cQph4WXC
よっしゃ!埋めて行こう。
ちょっと早かったか・・・
990くらいでも問題なかった気が。
大変だ !
C++用の API libpq++ が7.3で無くなっている
7.2には有るのに。
誰か知りませんか。
おさがわせしました。
GBorgで見つかりました。
よっしゃ!埋めていこう!
\∧_ヘ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
,,、,、,,, / \〇ノゝ∩ < 1000取り合戦いくぞゴルァ!!
/三√ ゚Д゚) / \____________ ,,、,、,,,
/三/| ゚U゚|\ ,,、,、,,, ,,、,、,,,
,,、,、,,, U (:::::::::::) ,,、,、,,, \ ぶーぶーぶー /
//三/|三|\ タリー
∪ ∪ (\_/)タリー タリー 先はなげぇ〜よ。
( ´Д) タリー タリー
/ つ (\_/) (\_/)ノ⌒ヽ、
(_(__つ⊂(´Д`⊂⌒`つ(´Д` )_人__) ))
1000!
?
966 :
NAME IS NULL:04/03/29 14:20 ID:bZAOhvfO
PostgreSQLって、コラム名にuser使えないの?
967 :
NAME IS NULL:04/03/29 14:43 ID:bZAOhvfO
ERROR: parser: parse error at or near....
って何よ。。
968 :
NAME IS NULL:04/03/29 15:00 ID:bZAOhvfO
********=# CREATE TABLE accesslog (
********(# time timestamp(0),
********(# path varchar(80),
********(# ssid varchar(80),
********(# user varchar(80),
********(# group varchar(80),
********(# lang varchar(10),
********(# remote varchar(80),
********(# browser varchar(80),
********(# error text);
ERROR: parser: parse error at or near "user" at character 84
969 :
初心者:04/03/30 10:16 ID:???
Cygwin+PostgreSQLを試そうとしている初心者です。
Windows2000でcygwin最新をインストールして、↓
Package Version
cygipc 2.03-2
cygwin 1.5.9-1
ipc-daemon2をバックグラウンドで走らせ、ipcsを実行すると
以下のようになるのですが、これってうまくいってませんよね?
$ ipcs
---------- Shared Memory Segments --------
shmid key bytes nattch status
---------- Semaphore Arrays --------
semid nsems key
---------- Message Queues --------
msqid used-bytes messages
どうすればうまく共有メモリの設定?ができるのでしょうか?
970 :
NAME IS NULL:04/03/31 17:11 ID:GNiAicAu
わしも嵌って、一度
$ ipctest h
してからやったらうまくいったかのような感覚を覚えたことはある。
でも実際それがキーになってるのかはよくわかんない。
あとは権限関係でこけてないかログ見てみるとか。
971 :
970:04/03/31 17:13 ID:GNiAicAu
2.xよりも1.xの方が事例が多くてラクな予感。
972 :
初心者:04/04/02 08:42 ID:???
>970
ありがとうございます。
Cygwin1.5系ではipc-daemonは2.xでないといけないと聞いたので
2.xでやってました。1.xも試してみます。
ログがあるんですか…。
973 :
NAME IS NULL:04/04/03 03:56 ID:ZUcU1XBz
pg_stat_activityで実行中のクエリを見たいんですけど、
全て<IDLE>になってしまいます。
pg_hba.confではクエリが見られるよう設定してあるんですが、
どうすれば良いのでしょうか。
974 :
NAME IS NULL:04/04/03 11:53 ID:om45/2Hf
Cygwin+postgreを使っておりまして、いままでは何も考えずにipc-daemonを起動してpostgreを起動してたのですが、
ふと疑問に思いまして、
ipc-daemon の ipcってのはどういう意味(なにかの略称?)なのでしょうか?
inter process communication
丸一年VACUUMもANALYZEもしてないDBにFULLかけたら!panic起こして鯖が死んだ(ワラ
977 :
NAME IS NULL:04/04/21 15:20 ID:KjL6eAbt
PostgreSQL 7.1.3の SJISデータを pg_dump して7.4のEUC-JPテーブルへリストすることって可能でしょうか?
978 :
NAME IS NULL:04/04/21 22:39 ID:OnfOdbnt
>>977 pg_dumpでプレーンテキスト指定すると、SQLで出るから、
nkfとか使ってコード変換して、あと手でなおすとこあったら、なおせばOKじゃない?
はしご高とか失われるデータはないかな。
ORACLEのUPSERT相当の処理を行うのに
key = SELECT key FROM t1;
if (key) {
UPDATE t1 SET 〜
} else {
INSERT INTO t1 〜
}
とやるのと
UPDATE t1 SET 〜
if (cmdtuples == 0) {
INSERT INTO t1 〜
}
とやるのとどちらが効率いいもんなんでしょうか?