5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

PostgreSQL & pgsql-jp ML 3テーブル目

1 :NAME IS NULL:04/03/20 17:24 ID:/Cqtf47w
PostgreSQLについて語って2万テーブルをめざしましょう。
関連アプリケーション特有の話題は、以下のスレッドへ。
pgsql-mlのヲチもここで。

●過去スレ
PostgreSQL
http://pc2.2ch.net/php/kako/989/989375812.html
PostgreSQL 2テーブル目(移転前)
http://pc2.2ch.net/test/read.cgi/php/1047317680/
PostgreSQL 2テーブル目
http://pc2.2ch.net/test/read.cgi/db/1056944337/

●関連スレ
PostgreSQLのことならここで聞け
http://pc2.2ch.net/test/read.cgi/db/1056960249/
MySQL vs PostgreSQL
http://pc2.2ch.net/test/read.cgi/db/1056943680/
PHP + PostgreSQL
http://pc2.2ch.net/test/read.cgi/php/983128806/
PerlでPostgreSQL
http://pc2.2ch.net/test/read.cgi/php/999249463/

2 :NAME IS NULL:04/03/20 17:30 ID:???
>1


3 :NAME IS NULL:04/03/20 19:19 ID:cQph4WXC
>>1
スレ立て乙。

4 :お願いします:04/03/29 15:15 ID:bZAOhvfO
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

5 :NAME IS NULL:04/03/30 16:50 ID:???
予約語だ。"user"とダブルクォートで括れ。
http://www.postgresql.jp/document/pg742doc/html/sql-keywords-appendix.html

6 :NAME IS NULL:04/03/30 19:11 ID:???
通し番号をつけるのに今は max を利用しています。

番号が飽和してしまったときの処理が必要なときは、
max を使わない方がいいのでしょうか。

7 :NAME IS NULL:04/03/31 23:46 ID:???
imiwakaran

8 :NAME IS NULL:04/04/08 17:18 ID:???
ガイシュツのような気もするのですが、ポスグレで

UPDATE t1 SET a = b, b = c;

とやったときの評価順序って規定されていないんでしたっけ?
それとも左から右が保証されてます?

9 :NAME IS NULL:04/04/08 17:33 ID:???
>>8
何が言いたいのか良くわからん。勘違いしているかも知れんが、

UPDATEされる前の値が参照されるので、順序は関係ないと思われ。

10 :NAME IS NULL:04/04/08 18:44 ID:???
>>9
> UPDATEされる前の値が参照される

これがわかれば充分です。そういうもんなんですね。

11 :NAME IS NULL:04/04/19 02:21 ID:???
ちょっと質問があります。
PostgreSQLオフィシャルマニュアル
http://www.amazon.co.jp/exec/obidos/ASIN/4844315897
読みながら色々試してたんですが……。

point型を数値に型変換する方法がわかりません。
atan2にぶちこんで、ラジアンに変換したいんですが、とりあえず生でぶちこんでも駄目だと言われます。
何か、とても簡単な方法があるような気がするんですが、みつけられないでいます。
ヒントをいただけないでしょうか。

12 :NAME IS NULL:04/04/19 02:46 ID:???
>>11
pがpoint型として
select atan2(p[0],p[1]) from table...


13 :11:04/04/19 12:52 ID:???
>>12
できました。
これって、他の幾何型にも使えるやり方ですね。勉強になりました。
ありがとうございました。

14 :NAME IS NULL:04/04/27 23:45 ID:wkoq9ZT+
Postgre本スレあげ

15 :NAME IS NULL:04/04/28 02:27 ID:KBMCaswf
Redhat 9でusogresがコンパイルできない…。
makeするとこんなエラーがでてしまう…。

/usr/include/c++/3.2.2/exception:57: overriding `virtual const char*
std::exception::what() const throw ()'
make[2]: *** [exception.o] エラー 1
make[2]: 出ます ディレクトリ `/home/nozaki/usogres-0.8.1/src'
make[1]: *** [all-recursive] エラー 1
make[1]: 出ます ディレクトリ `/home/nozaki/usogres-0.8.1'
make: *** [all-recursive-am] エラー 2

gccとglibc関係はインストールパッケージのrpmそのまま。

compat-gcc-7.3-2.96.118
gcc-g77-3.2.2-5
gcc-java-3.2.2-5
libgcc-3.2.2-5
compat-gcc-c++-7.3-2.96.118
gcc-3.2.2-5
gcc-c++-3.2.2-5
gcc-gnat-3.2.2-5
glib-1.2.10-10
glibc-common-2.3.2-11.9
glibc-2.3.2-11.9
glib2-2.2.1-1
glibc-devel-2.3.2-11.9
glibc-kernheaders-2.4-8.10

usogresのサイトみるとgcc-2.95.x と glibc2.1.9xではだめで、最新のgccならOKと
いうようなことを書いてあるけど、新しすぎてもだめなのかな?
だれか上手くいった人います?

16 :NAME IS NULL:04/04/28 04:25 ID:???
テーブル作成日時とテーブル変更日時を知りたいんですが
どんなコマンドでみれますか?

17 :NAME IS NULL:04/04/28 16:45 ID:N09xy6IO
>>16
ls(1)

18 :1:04/04/29 02:52 ID:???
新スレたててから移行まで1ヶ月か・・・

19 :NAME IS NULL:04/04/30 15:17 ID:???
oid ってありますよね?これが最後まで行ったらどうなるんですか?

20 :NAME IS NULL:04/04/30 15:26 ID:???
>>19
行き着いたときだったか、使い尽くしたときだったか忘れたけど、
動かなくなってしまうんじゃなかったかな。
今のところそこまで使い切ったDBは存在しないらしい。
って、ソースコードの中かリリースノートかなんかで読んだ。
開発者自身も検証していないようなコメントだった。

21 :NAME IS NULL:04/04/30 17:16 ID:???
>>15
usogres使うならいっそpgpoolにしてみたら?
http://www2b.biglobe.ne.jp/~caco/pgpool/
http://itpro.nikkeibp.co.jp/members/ITPro/oss/20040422/2/

22 :NAME IS NULL:04/05/01 00:19 ID:???
>>21
なるほど、これもよさげですね。
こちらを試してみます。

どうもありがとう。

23 :NAME IS NULL:04/05/01 00:41 ID:ZjwnXM2M
>>19
おいらも気になってた
確かlog int だったかな
じゃ直ぐ無くなる

24 :NAME IS NULL:04/05/01 01:33 ID:???
>>19
一応初期オブジェクトの分を除いてループする。
けどそのときの動作保証はない。

25 :NAME IS NULL:04/05/01 09:55 ID:???
log intはイヤだ

26 :NAME IS NULL:04/05/01 12:38 ID:???
MLで巨大なファイルを扱いたがってる人、最近DBを使い始めたのかと
思ったらpostgre95のころからMLにいるのね。

ぐぐったら1996年のアーカイブが出てきたよ。

経験=スキルではないんだね…

27 :NAME IS NULL:04/05/01 15:23 ID:???
漠然とイメージだけで「メモリが足りないんじゃない」とか
「常識的に考えましょう」とか釣られて回答してる奴らの方がキモいのでは。
結局誰も答えられてないし。

ファイルがでかいからって、lo_unlinkって5分もかかるのかなあ。

28 :490:04/05/04 12:02 ID:jR8ayW8M
ちなみに「pg_ctl start」コマンドを打つと以下のようになります。


Administrator@windows2000 ~
$ pg_ctl start
pg_ctl: Another postmaster may be running. Trying to start postmaster anyway.
FATAL: File /usr/local/pgsql/data/PG_VERSION is missing. This is not a valid da
ta directory.
pg_ctl: cannot start postmaster
Examine the log output.

29 :NAME IS NULL:04/05/04 12:03 ID:???
どうちなむのだろう?

30 :490:04/05/04 12:04 ID:jR8ayW8M
まちがいました。


31 :NAME IS NULL:04/05/12 04:59 ID:???
PostgreSQLにODBC経由でMS Accessを使ってテーブルを見ています。
ですが、テーブルを表示させると全レコード全カラムの値が「#Deleted」
になってしまう場合があります。

ですが、Postgres上で

create view hoge as select * from fuga;

(fugaは#Deletedになるテーブル)
とやって、このビューをAccessで見るときちんと値が取れています。
なんか不思議です…

んで、テーブルを見たときに「#Deleted」になる場合とならない場合があります。
特定のテーブルではなる、別のテーブルではならないんです。
この再現条件がよくわかりません(わかってもどうなるもんでもないかも)。

この変な現象ってぐぐってみても不思議な現象みたいな書かれ方をしてて
原因が特定できてないような感じです。

これ、回避する手段ありますか? view使うのは…それでもいいんですけど、
できれば直接テーブルを参照してってのはできないんでしょうか?

バージョンはPostgreSQL7.4.2、ODBCドライバ7.03.02.00、Access2000(9.0.3821 SR-1)です。
あと、Postgresとの接続にはSSHのトンネルを介しています。

32 :NAME IS NULL:04/05/12 10:13 ID:???
>>31
Oracleとかでもそうなるよ。
他のクライアントから削除、更新をすると#Deletedになるんじゃなかったかな。
で、結局回避方法は再表示(だったか再接続だったか・・・)ぐらいしか
なかったような気がする。

原因はプライマリキーをアクセスが拾えないとかじゃなかったかな。

「かなかな」ばかりですまんが。

33 :31:04/05/13 03:33 ID:???
>>32
遅くなってすんません。

他からはデータベースに接続してない状態で
ただ単にテーブルを表示させるだけでも#Deletedになっちゃうんです。

テーブルの定義をして、念のためAccessを終わらせて、
再度起動してテーブルを開くと#Deletedになっちゃうんです。

なんか、情報があんまりなさそげですね…
そんな状態でもinsertやupdateはできてるみたいだから、参照はviewを使うことにするか…

34 :NAME IS NULL:04/05/13 16:00 ID:???
>>31
うろ覚えなんだけど、OIDオプションの「インデックスを装う」をonにすることで回避できたような気が。


35 :NAME IS NULL:04/05/13 17:29 ID:???
>>31
serialやdefaultを使ってるとなる?
http://www.interwiz.koganei.tokyo.jp/software/PsqlODBC/faq.html

36 :31:04/05/15 05:45 ID:???
またまた遅くなりました。本当にどうもありがとうございます。

>>34
今現在手元に実機(てか、Accessの入ったマシン)がないので、
あとでやってみます。

「oid オプション 装う」でぐぐってみたらこんなのが引掛りました。
http://osb.sra.co.jp/PostgreSQL/odbc/odbc732.html
まだ読んでませんが、参考になりそうです。

>>35
defaultを使ってます。でもその文書の記述だとinsertなどをしたときになるような感じですね…

37 :NAME IS NULL:04/05/17 10:13 ID:???
>>36
テーブルに主キーが設定されてないとか?

38 :NAME IS NULL:04/05/25 18:57 ID:xgZdnpwF
7.4でunicodeのデータベース使ってるんだけど、euc-jpのPHP4.3.4からpg_connectするとバケまくり。
解決方法しらないですか?

39 :NAME IS NULL:04/05/25 19:11 ID:xgZdnpwF
pg_set_clientencodingで解決した。けど、どっか一括で設定できんのかね・・・

40 :NAME IS NULL:04/05/25 19:18 ID:???
>>39
postgresql.conf

41 :NAME IS NULL:04/05/26 00:42 ID:hRTK0adv
>>40
それをやるとJavaから呼び出したときに文字化けするかもしれないことがわかった。
一括設定はあきらめる。

42 :NAME IS NULL:04/05/26 17:57 ID:???
PostgresSQLのバージョンアップで
7.1.2から7.3.3にしました。
データの移行が済んで、データの確認をした所
order by が正常に機能しなくなりました・・・
症状としては、

テーブルを作ってあいうえでデータを入れてorder byをかけた所






(4 rows)
で帰ってくると言う物です。

ほかでも調べて
./configureの設定やnitdb --encoding=EUC_JP --no-locale
もやってみたのですが、全然うまく行きません。
なんとかなる方法は無いでしょうか?

環境は
PostgresSQL7.3.3
apache_1.3.29
PHP4.3.1
です。

どなたかよいアドバイス等あったらお願いします。

43 :NAME IS NULL:04/05/26 18:33 ID:???
>>42
のまえに、なぜ7.3.3なんだ。
せめて7.3.6に上げてみれば。

44 :NAME IS NULL:04/05/26 23:11 ID:???
その手の問題はほとんどlocaleが原因なんだけどね。
psqlからshow all;かなんかしてlc_*がどうなってるか見てみたら?

45 :42:04/05/27 01:14 ID:???
>>43,44

返事ありがとうございます。また返答遅くなって申し訳ございません。
Show all で確認したところ、エンコーディングはEUC_JPなっていました・・・
Psql -l だとEUC_JPと表示されます・・・・
そしてlc_* us_en に・・・・
これが原因なのでしょうか?
/etc/sysconfig/li18nも
LANG=EUC_JP
LC_ALL=EUC_JP
LC_CTYPE=EUC_JP
LINGUAS=EUC_JP
と変えてあります・・・


46 :44:04/05/27 11:43 ID:???
>>45
ソレダ!!
lc_collateあたりは、initdbした時に決定して以降変更できないはず。
やっぱinitdbの時に--no-localeなってくれなかったように
見えるな。気の毒だけどinitdbしなおすしかないと思いマス。

47 :42:04/05/28 05:33 ID:???
>>44
返事が遅れて申し訳ないです。

pg_ctl stop
rm -rf /usr/local/pgsql/data
initdb --encoding=EUC_JP --no-locale
pg_ctl start

で、テストデータを流しなおして
createdb test_base
psql test_base
CREATE TABLE T_TEST (T VARCHAR(128));
INSERT INTO T_TEST (T) VALUES ('あ');
INSERT INTO T_TEST (T) VALUES ('い');
INSERT INTO T_TEST (T) VALUES ('う');
INSERT INTO T_TEST (T) VALUES ('え');
SELECT * FROM T_TEST ORDER BY T;

であいうえお順にデータが並びました。
その後
SELECT * FROM pg_settings WHERE name like 'lc%' or name like '%encoding'
でサーバークライアント共にエンコードがEUC_JPになって居るのを確認。
lc_*が全てCになっているのを確認して、データのリストアを無事に終了しました。

初歩ミスでポストマスターが正常に終了せずに変な挙動になっていたみたいです。
無理やりポストマスターをつぶして上記作業で正常動作になりました。

>>43
助言に従って7.3.6にアップしました。

以上ありがとうございました。

48 :NAME IS NULL:04/05/29 03:54 ID:???
にしても、最新の7.4.2にしなかった理由が知りたい。

49 :NAME IS NULL:04/05/29 16:29 ID:???
バージョン上げればいいってもんでもないしょ。


50 :NAME IS NULL:04/05/29 18:46 ID:???
それにしても、運用方法とかデータ型が大きく変わるわけではないのに、7.4のメリットを捨てて7.3にする理由が知りたい。
だって、もとは7.1だよ。

51 :NAME IS NULL:04/05/30 00:23 ID:???
よくわかんねぇけど
激しく変化したから?

52 :NAME IS NULL:04/06/03 02:09 ID:???
さいとうさんも大変だな。

ここで聞けスレにも書いてるみたいだが、英語だけでなく日本語も苦手っぽいし



53 :NAME IS NULL:04/06/04 22:35 ID:???
BOFの中継を見るの忘れた…

54 :NAME IS NULL:04/06/06 02:05 ID:czq84YCV
以下のモノをCで書き直すにはどうしたらよいでしょうか?
教えてエロい人。

CREATE FUNCTION hogehoge() returns opaque as '
BEGIN
NEW.last_access := CURRENT_TIMESTAMP;
RETURN NEW;
END;
' language 'plpgsql';

55 :NAME IS NULL:04/06/06 09:29 ID:???
char* sql = "CREATE FUNCTION hogehoge() returns opaque as ' "
 "BEGIN "
 "NEW.last_access := CURRENT_TIMESTAMP; "
 "RETURN NEW; "
 "END; "
 "' language 'plpgsql'; "

56 :NAME IS NULL:04/06/07 17:02 ID:???
>>54
http://www.postgresql.jp/document/pg742doc/html/triggers.html
http://www.postgresql.jp/document/pg742doc/html/spi.html
この辺の話だと思うが、諦めたほうが得策。
どうしてもやりたかったら、自力でやってみてどこまで出来たか教えれ。

57 :NAME IS NULL:04/06/21 17:35 ID:HUxGxZ26
PostgreSQL 7.2.1 から 7.3.4 に移行しようとしています。
7.2.1 で使っているラージオブジェクトを含むデータを
 % pg_dump -b -F c DB_NAME > foo.out
などとしてバックアップを取り、7.3.4 の方で
 % pg_restore -d DB_NAME foo.out
として戻そうとすると、
 pg_restore: [archiver (db)] could not execute query: ERROR: Column "COLUMN" is of type timestamp without time zone but default expression is of type text
     You will need to rewrite or cast the expression
と言われてしまいます。

ラージオブジェクトを含まないデータなら、timestamp 型の記述を書き換えて
restore すれば良いみたいなのですが、ラージオブジェクトを含むデータの場合は
どう対処すれば良いでしょうか。お知恵をお貸し下さい。

58 :NAME IS NULL:04/06/21 18:10 ID:???
なんで7.3.4とか中途半端なバージョンなの?

59 :NAME IS NULL:04/06/21 19:38 ID:HUxGxZ26
たまたま今の作業環境が 7.3.4 なだけで、深い意味は無いです。
7.2.1 から最新バージョン(7.4.x)への移行の問題として捉えて下さって結構です。
どなたかよろしくお願いします。

60 :NAME IS NULL:04/07/09 01:31 ID:???
MLにひさびさに面白い方がきていましたね。
なんでしょうねあれ。

61 :NAME IS NULL:04/07/09 09:18 ID:???
房でしょう

62 :NAME IS NULL:04/07/19 18:43 ID:3/3kexye
文字列の場合、
 ・char
 ・varchar
 ・text
の違いがわかりません(><)
誰か教えてください。特に、charとtextの違い。
やっぱり、textの方がメモリを食うんですか?

63 :NAME IS NULL:04/07/19 19:15 ID:???
(><)

64 :NAME IS NULL:04/07/19 19:46 ID:???
(><)

65 :62:04/07/19 19:56 ID:???
PostgreSQLのことならここで聞け
だと思ってカキコしたら違ってました・・・(><)
dat落ちしてしまっているみたいだし・・・どうすれば・・・。

66 :NAME IS NULL:04/07/19 20:20 ID:???
>>65
http://pc5.2ch.net/test/read.cgi/db/1056960249/

67 :62:04/07/19 21:59 ID:???
>>66
ありがとう。行ってきます。

68 :NAME IS NULL:04/09/30 11:17:58 ID:???
こちらのスレは使われないなぁ。

俺的ブックマーク
Windows版PostgreSQL配布サイト
ttp://pgfoundry.org/
ttp://pgfoundry.org/projects/pginstaller/

69 :NAME IS NULL:04/11/19 10:56:55 ID:???
UTF-8 で困る環境って携帯電話以外でもあるの?

70 :NAME IS NULL:04/11/19 16:31:44 ID:???
Lモード

71 :NAME IS NULL:04/11/19 17:38:51 ID:???
MULCOとかWebTVとか。

72 :NAME IS NULL:04/11/19 18:57:48 ID:???
出力とDB内部がUTF8なのと直接的な関係はないぞ

73 :NAME IS NULL:04/11/19 19:10:52 ID:???
UTF-8 だと半角カナも使いやすいのになぁ。
ISO-2022-JP じゃなきゃだめなのかぁ。

74 :NAME IS NULL:04/11/22 20:52:17 ID:???
34321 みたいな質問はどういう風に答えたらいいのでせうか。
いやな予感がするので、レス書けません。

75 :NAME IS NULL:04/11/22 21:55:28 ID:???
いい英和辞典でも紹介するのがよいのでは?

76 :NAME IS NULL:04/11/23 07:36:43 ID:???
pgpoolを使うことを考えてるんだけども、
time関連の値が同じになることが保証されないんだってね。

こまかいtimestampに依存をしないようにはするけど、
日付がちょうどかわるときにきたtime関連値を使用する値をどう扱えばいいんだろう。
できればデータベースで完結する方法として。

例えば、日付と日付支番を主キーにしたいんだけども、
マスターのnowが2004-11-23 23:59:59.9を前提に処理し、
セカンダリが2004-11-24 0:0:0.1を前提に処理したら、
マスターでは日付、日付支番が
2004-11-23 10
なりとなり、
セカンダリでは、日付、日付支番が、
2004-11-24 1
となる。

日付が変わる直前直後5秒づつぐらいアクセスを拒否する設定とかでもいいんだけどな。
同期がとれているんだったら。

77 :NAME IS NULL:04/11/23 13:11:58 ID:???
>>75 ありがとう。
英和辞書を紹介したら、引き方のレクチャーもしなきゃいけない
なんてことないですか。

あ、堅いレスがついているようですね。

78 :NAME IS NULL:04/11/23 22:11:07 ID:???
>>76
使ったことないが Slony-I は time の値は同じになるとのこと。
非同期レプリだけどね。

79 :NAME IS NULL:04/11/26 18:25:32 ID:TIFoj5JU
>>78
ただ、そちらはラージオブジェクトが使えないそうなんですよね。
pgpool_now()とかって関数を入力したら、そこだけ置換してくれるとかあれば嬉しいのに。

80 :NAME IS NULL:04/11/26 19:49:50 ID:ybnduqE4
>>79
pgpoolに関してはSQLレベルで分配してるだけだから。
だからpostgresql側の変更が不要なかわりに、
nowなどサーバ依存な動作は不許可なわけ。

仮にpgpool_now()なんてつくって、それはpgpoolが解釈して
時刻を埋め込むものだとしても、どっかで破綻しない?
クエリーがpgpool依存になるってのは目をつぶるとしても。

って書いてて思ったのだが、
クエリーを投げる側(アプリ側)でnowとか使わないように
アプリ側で時刻を埋め込めばいんじゃん。


#問題はシーケンスとかだろなあ。

81 :NAME IS NULL:04/11/27 01:02:45 ID:???
>>79
ラージオブジェクトは使えないね。
セミナーに行ったとき、開発者が NO と断言してた。

82 :NAME IS NULL:04/11/28 11:09:47 ID:???
>>80
>って書いてて思ったのだが、
>クエリーを投げる側(アプリ側)でnowとか使わないように
>アプリ側で時刻を埋め込めばいんじゃん。

ってまあ、たしかにそうなんだけどね。
ただ、nowはよく使う関数だからなぁ。

Slony-Iはテーブル単位での管理ができるってことだから、
ラージオブジェクトの管理だけ別にやって残りで使うって手もあるか。

83 :NAME IS NULL:04/11/28 22:53:29 ID:7LOVBWil
>>82
Slony-Iは非同期。
最悪10秒くらいデータの不一致が発生するけどOK?


84 :NAME IS NULL:04/11/29 21:17:05 ID:???
>>83
うーん、かたっぽのDBがアボーンした時に、
即座にもう片方で動作できるようにするのがレプリケーションする目的なんで、
最悪スレーブの方読みに行かなくてもいいかもなぁとか思ってたり。

日付関連値をできるなら主キーにしたいんで、
そこの不整合が起きるとめんどいしね。

pgpoolで、一つ思ったことに、
アプリ、pgpool側で乱数を発生させ(重複がまず発生しない桁数)
マスタ側で時刻テーブル(乱数、now())なりで一旦適当なテーブルにnowなりの値を保存。
マスターもスレーブもそのマスターにあるテーブルをみて、乱数をキーにして時刻を取得。
マスターアボーンしてるとわかったら、スレーブは自前のnowを使う。

これはシーケンスにも使えるかもね。
縮退運転に備えて、シーケンス番号をこまめにセットしないとならないけど。
シーケンスにトリガ貼るってできるんかな、、、、、?

もちろん、これはDB越しのアクセスってなんかでき無いとダメだけどね。
Slony-Iをみるかぎりできそうだけど(でないとレプリケーションできないはずだよね)
試してない。

とか言うのどうかなぁ?とか思ってみたり。

85 :NAME IS NULL:04/11/29 21:20:31 ID:???
シーケンス発行だけでもpgpoolでやってくれないものかなぁ。
まあ、順序が保証されるんなら、max+1でもいいから特に重要ではないかもしれんが。

86 :NAME IS NULL:04/11/29 21:25:57 ID:???
レンカキすまん。

、、、良く考えたら、「順序が保証される」ようにできるのなら、
どちらかのシーケンスにpgpool経由以外からアクセスさせないようにしておけば、
両方のサーバーともシーケンス番号は同じになるんじゃないかな

それともおいら何か見落としてる?

87 :NAME IS NULL:04/11/29 21:58:26 ID:???
というか、そんなの日常でやってる奴なんて稀だから、
自分で試さないと答えは出てこないような気が。

88 :NAME IS NULL:04/11/30 09:34:18 ID:8FceD7Au
>>86
原理的には。
しかし、運用に負担がかかる。

そもそも、シーケンスという概念で隠蔽したもろもろが、
そのような運用にしたとたん、
主にトラブル時だが、一気に表面に出てくる。
nowとかも同じね。

運用が面倒になることのデメリットが理解できないのなら、
レプリケーションを実運用すべきでない。


89 :NAME IS NULL:04/11/30 09:51:11 ID:???
>>84
乱数とかいってる時点で厨房だな。

レプリケーション、いやDBに手を出すのはやめといたほうがいい。


90 :NAME IS NULL:04/12/01 01:35:49 ID:???
いや、すべての電気機器を操作するのは危険だ。

91 :NAME IS NULL:04/12/02 12:59:27 ID:pHcXoZZE
psqlodbc.dll内の関数のマニュアルとかってどこにあるんですか?
探したけど見つかっていない状態なのでどなか教えてください

92 :NAME IS NULL:04/12/27 00:15:28 ID:NPDFfQpi
siteAとsiteBという二カ所の物理的に離れてる場所があるとして、
どっちにもpostgreSQLが回してあって、
どっちかがサイトごと死んでもそのまま生かし続けられる、
と云う構成にしたい場合、
siteAとsiteBにそれぞれpgPoolを入れて、
その下のdbをたすき掛的にレプリケーションをしておけばok?
ちなみにpgPoolへの接続は自動的に切り替えられるものとして。

わかりにくいかな?
まあ明日テストしてみるけど。

93 :NAME IS NULL:04/12/27 00:18:34 ID:???
>>92
pgpoolはどちらか一方、もしくは別マシンでOK。

94 :92:04/12/27 00:23:04 ID:NPDFfQpi
いや言葉が足りなかった。すまん。
siteAとsiteBには通常運用時(両方生きてるとき)はパラでアクセスが来るんだよね。
だからたすき掛がいいかなと。

95 :93:04/12/27 00:35:57 ID:???
あぁーなるほど。はやとちりスマソ。

96 :NAME IS NULL:04/12/27 00:36:39 ID:???
siteAとBの間のネットワーク速度は大丈夫?

97 :92:04/12/27 00:38:54 ID:???
それは問題ない

98 :92:04/12/28 23:06:02 ID:???
今日試してみたけどあまりにもあっさり成功。
クラスタDBのネットワークケーブル抜いたりしたけど、
2度ほど障害が出ただけであっさり再開(縮退モード)。
こりゃ便利だわ。

99 :NAME IS NULL:04/12/29 11:21:19 ID:???
Postgre初心者なのですが、
psqlのコンソールから日本語を入力する方法
ってどうすれば調べられるでしょうか?

100 :NAME IS NULL:04/12/29 11:28:54 ID:???
>99
言ってる意味が良くわからんのだが。日本語って普通に入力できないか?

ってか、情報少なすぎ。
Postgresが動いているマシンの OS、文字コード設定
psqlを動かしている画面(端末エミュレータ?)が動いている OS、端末ソフト、文字コード設定

最低限このぐらいを晒さないと答え様がない罠。

101 :NAME IS NULL:04/12/29 11:57:58 ID:???
>99
DB名や項目名に日本語を使うのはアマチュアがよく犯す間違い

102 :NAME IS NULL:04/12/29 12:13:30 ID:???
OSはFreeBSD、文字コードはEUC_JPでテーブルを作成。
端末エミュレータは起動してません。
Wnnは起動してます。kinput2もインストール済みです。
つか、日本語入力の仕組みがイマイチわからないんですが。
JSERVERはWnnをローカルホストで起動させ、
kinput2をFEPに設定することはできてると思うのですが。

また、項目やDB名に日本語は使いません。
SQLファイルを作成してpsqlに流し込む方法もあるのかもしれませんが、
日本語が使えるエディタが起動できていないので、
どうしようかと思案中です。

あと、DBの基礎知識は少しはあります。運用経験はありません。
どうか、良きアドバイスをお願い致します。

103 :NAME IS NULL:04/12/29 12:18:35 ID:???
pgAdmin 使うとか。

アプリケーションの裏において使うものなので、
アプリを作るところからはじめてくれ。

104 :99、102:04/12/29 12:30:15 ID:???
>103
Windowsで使うものでは?
今Windowsマシンとネットワーク繋がっていないんです。

105 :NAME IS NULL:04/12/29 12:51:04 ID:3gim2RWe
>102
X使ってないならkonしてるか?
[shift]+[space]で漢字入力にならないか?


106 :NAME IS NULL:04/12/29 12:59:30 ID:???
>>100
そもそもpsqlじゃないときは
日本語使えてるの?

使えてないなら板違い

107 :99、102:04/12/29 13:44:45 ID:???
>105
konって表示専用じゃないんですか?
前に起動させたことはありましたけど、
シフト、スペースで何も起こりませんでした。

とそれよりpostmasterが起動できなくなってしまいました。
いろいろ環境変数を追加したりしてるのが原因でしょうか?
一度再起動してみます。

psqlの時も日本語つかえてません。
emacsとかどうやって起動させるんでしょう?
UNIX板で聞けばいいですか?

108 :NAME IS NULL:04/12/29 13:47:56 ID:???
>>107
その状態でここで質問するってことがすごいね。

悪いことは言わない。
あきらめろ

109 :105:04/12/29 13:57:32 ID:???
>107
少し落ち着け。

>konって表示専用じゃないんですか? 
漢字が正しく入力されているか、表示されなくても分かるのか?

ってかさ、Xは起動してるの?
それともフルスクリーンでテキストコンソールになってるの?
そこが分からんと、説明のしようが無い。

#kinput2とか言ってる所をみると、X使ってるっぽいけど、
#「端末エミュレータは起動してません」ってじゃあ、藻前がpsqlを使ってる画面はどこに出てるのかと小一時(ry
#Xでデフォルトのxtermで作業してる気がしてならないのだが・・・。

110 :NAME IS NULL:04/12/29 14:02:43 ID:???
pgAdminIIIの1.2.0でフォント設定をMSゴシックにしてみると
とても面白いことが起きるよ

111 :99、102:04/12/29 14:08:59 ID:???
>109
どうもレスありがとうございます。
UNIX使いの人にも親切な方っていらっしゃるんですね。

konを起動させたときは、色々キーを叩いてみましたが、
アルファベットしか入力できなかったです。

Xが起動してるとは・・・psコマンドで見る限り、
cshしかアクティブになってませんが。
ログインスクリプトとか全然書いてないので。

フルスクリーンでテキストコンソールにはなってます。
Xでデフォルトのxtermとは一体?たぶんそうだと思うのですが、
どのようなサイトを見たら意味がよくわかるでしょうか?

>#kinput2とか言ってる所をみると、X使ってるっぽいけど、
>#「端末エミュレータは起動してません」ってじゃあ、
>#藻前がpsqlを使ってる画面はどこに出てるのかと小一時(ry
>#Xでデフォルトのxtermで作業してる気がしてならないのだが・・・。

そう言われてみると端末エミュレータは起動してますね?

しかし、postmasterが起動しなくなったのは一体???

112 :NAME IS NULL:04/12/29 14:13:00 ID:???
>>111
強制終了かなにかでdata/postmaster.pid のファイルが残ったまま落ちちゃったんじゃないか?
あったら消せ。

113 :105:04/12/29 14:21:51 ID:???
>111
その様子だとXは起動してないな。

とりあえず、FreeBSDの日本語周りのFAQな。
http://www.jp.freebsd.org/QandA/HTML-QA/japanese-qa.html
ここ見て分からなかったら、

初心者もOK! FreeBSD質問スレッド その56
http://pc5.2ch.net/test/read.cgi/unix/1103066264/l50
この辺にでも行って「コンソールでの日本語入力の起動方法」を聞いてみそ。

psqlも普通のコンソールアプリだから、漢字入力が出来るマシンからTELNET(SSH?)して
漢字入力しても同じはずだけどな。

114 :NAME IS NULL:04/12/29 14:24:18 ID:???
>>110
なにも起こらないけど?
どうなるの?

115 :99、102:04/12/29 14:47:10 ID:???
>112
/usr/local/pgsql/dataをみましたが、そのようなファイルはありませんでした。
どうなってるんだか。

116 :NAME IS NULL:04/12/29 21:13:30 ID:???
管理者に聞いて下さい

117 :NAME IS NULL:04/12/29 23:07:09 ID:???
>>114
起こらないはずないよ
まぁやってみれば分かります


118 :NAME IS NULL:05/01/11 16:20:11 ID:mtFH19Sy
CSEみたいに使いやすくてかつ
開発が続いてるクライアントアプリってないですかね?

今はCSEをだましだまし使ってる

119 :NAME IS NULL:05/01/12 15:03:33 ID:/0becKYD
すいませんちょっと質問があるのですが、Webmin上からPostgresが見れないのです。
僕のような入門者には、Webminはありがたいのです。

SQL select tablename from pg_tables where tablename not like 'pg_%' and tablename not like 'sql_%' \
order by tablename failed : ERROR: relation "pg_tables" does not exist

このようなエラーを返してくれます。

状況としては、最初にソースからインストールしたのですが、うまくいかずapt-get からRPMでの
インストールを行いました。OSはFC3、Pgのバージョンは7.4.6です。

どちらさまかお助けいただけないでしょうか。

120 :NAME IS NULL:05/01/12 15:16:28 ID:???
初期化してないとか

121 :119 initdb:05/01/12 16:43:03 ID:/0becKYD
>>120
神!てゆうか未熟すぎてすみませんでした。
朝起きたら120様のほうに向かいおまいりします。

122 :120:05/01/12 16:51:46 ID:???
東京都目黒区在住です

123 :NAME IS NULL:05/01/12 22:13:52 ID:???
SSHを使って、コマンドでテーブルを表示させようとしたのですが、文字化けしました。
どうすれば解決するでしょうか?

124 :NAME IS NULL:05/01/12 22:43:17 ID:???
psqlの話をしてると仮定して \encoding

125 :NAME IS NULL:05/01/17 11:59:04 ID:???
update 対策で vacuum を cron で回す、という話はよく聞きますが、
例えば PHP などで大量に update した後にプログラム内で pg_query($db, "vacuum") を
している方はいらっしゃいませんか。


126 :NAME IS NULL:05/01/17 13:25:12 ID:???
そこまでしなくていいんじゃないかな。

127 :NAME IS NULL:05/01/17 14:58:39 ID:???
つか、なんでcronで回すかってーと、systemのidle時を狙い打つためなのね。
phpでアップデート後というとまあ普通は時間が特定出来ず、高負荷時に
VACUUMをかける可能性もあるのでお勧めできない。

その大量アップデートの後はsystemが比較的idleなことが確実で、どうしても
やりたいんだというなら止めないが。

更新直後のVACUUMの必要性はその大量更新によって参照パフォーマンスに
どれくらい影響があるかによる。たとえば数百万単位のレコードの
index対象項目を殆ど更新してしまうような更新処理でもしない限り、
そこまですることはないと思う。

128 :125:05/01/18 10:18:51 ID:???
>>126-127
ありがとうございました。

一番いいのは DB のパフォーマンスが下がり、
かつ idle なら vacuum 自動実行なのですが。

129 :NAME IS NULL:05/01/18 10:59:11 ID:???
すみません。教えていただきたいのですが、
SELECT count (*)を使わないで、
システムカタログ等からテーブルのレコード件数を把握したいのですが、
どこを見れば宜しいでしょうか。

130 :NAME IS NULL:05/01/18 11:25:39 ID:2UkA0amN
>>128
パフォーマンスが下がるって意味わかる?
なんか、パフォーマンスっていいたいだけかと。
4時ごろやっときゃ問題なかろ。

131 :NAME IS NULL:05/01/18 12:45:46 ID:???
>>129
まずはしょーもないこと考える自分の頭の中を

132 :125:05/01/18 12:51:50 ID:???
>>130
現在は 30 分おきに cron しているのですが、
それでは足りないときがあるんです。

かといって 10 分おきだとご指摘の通り
過負荷時に vacuum 走ることになりますよね。

ですから `w` で rup を取得し、idle がある閾値以下なら
pg_query() で vacuum させようかとも思い始めました。


133 :NAME IS NULL:05/01/18 13:13:59 ID:22aeSu5q
>>132
おまえのところは10分おきに百万レコード単位でインデックスの変更
が行われるのか?ただVACUUMいいただけちゃうんかと。

134 :NAME IS NULL:05/01/18 13:19:00 ID:???
>現在は 30 分おきに cron しているのですが、
>それでは足りないときがあるんです。

30分置きにVACUUMしても足りないというのは特殊な状態だから、
多少はどういったシステムなのか、レコード数の規模なんかも
出さないと答えようがないと思うぞ。

>かといって 10 分おきだとご指摘の通り
>過負荷時に vacuum 走ることになりますよね。
10分置きVACUUMを考慮するということは更新が10分以内には終わる、
ということでそれは「大量」とは思えないんだよね。

だもんで、もうちょい詳しく情報出してくれんと。

135 :132:05/01/18 15:34:42 ID:???
情報小出しですみません。

100 件しかない商品テーブルだと思ってください。
その 100 件の(例えば)在庫数カラムの在庫数を書き換えるために
毎回 100 回の update が一気に走ります。普通は数秒で終わります。

この作業が昼間であれば 1 分間に 1 〜 10 回くらい発生します。
ピーク時にそんな状態が数分続くと update が異常に遅くなるんです。
数秒のものが十数秒、数十秒になり、load avarage も上がっていきます。
vacuum するとまた数秒程度に戻ります。

この update 作業中にもいろいろな SQL が走りますが、
その商品テーブルを select するだけでその他に update/insert はありません。

PostgreSQL 7.2.6 / P3-930M / 256M / RH7.3 という環境です。

136 :NAME IS NULL:05/01/18 16:24:49 ID:???
1操作で更新系100SQL、ピーク分1000SQL以上走るという
実装が既に腐ってるんだが。

ものすごい勢いで不使用領域を作るからVACUUMも大事だけど、
レコードはたかが3桁のオーダーだしなあ。
トランザクションの書き戻し待ちさせられててスピードが
落ちてるだけのような希ガス。

まあ、実装を考え直したほうがいいが、動いているものの改修だと
そうもいかないだろうし、辛いやね。

137 :NAME IS NULL:05/01/18 19:08:20 ID:22aeSu5q
単純にファイルI/Oの問題だろうな。まずはメモリを1GBにしてみろ。

138 :132:05/01/18 21:34:26 ID:???
>>136-137
いろいろありがとうございました。
とりあえずメモリを増やしてみます。

139 :NAME IS NULL:05/01/18 21:36:41 ID:???
>>136
a 〜 z にそれぞれ 1 〜 26 の数字を振り、
z の 26 を 1 にした場合、
a は 1 → 2, b は 2 → 3, ... y は 24 → 25 とずらす場合に
26 回 update が走るのですが、これのうまい実装はあるでしょうか?

140 :NAME IS NULL:05/01/18 21:42:52 ID:???
>>139
>これのうまい実装はあるでしょうか?
そもそもその「これ」とやらが間違ってると思われ。

141 :NAME IS NULL:05/01/18 22:02:24 ID:???
>>140
では、「これ以外」の実装とは?

142 :NAME IS NULL:05/01/18 22:07:13 ID:???
PostgreSQL自体に手を加えたいのでは無いでしょうか?

143 :NAME IS NULL:05/01/18 22:34:59 ID:???
>>139
意図がつかみかねるけど、a 〜 z (1から26)の値が入っている
項目を X としたときに、(X + 1) % 26 をやりたいと言ってるだけじゃないか?

144 :NAME IS NULL:05/01/18 23:41:04 ID:???
ねじが100種類あって、Aセットなら20種類50個、Bセットなら50種類230個、
というようなの組み合わせで販売するとする。
セットのねじ−個数はなんらかのマスタに持つとする。

で、Aセットが購入されたら、20種類のねじ在庫からおのおの個別個数の
在庫を引かなければならない。もちろんねじだから、1本からも販売はある。

で、最多注文時間帯は1分間に10受注ぐらいする場合がある。

このWebシステムのうまい実装を考えよ。

‥か。こりゃ結構骨の折れる演習問題だな。

145 :NAME IS NULL:05/01/19 00:15:59 ID:???
RDBではなくOODBを使うと、RDBの場合より実装しやすそう。

つうか、1分に10受注って、ピーク時にもそんなに負荷はかからない、ということがいいたいのかな?

146 :NAME IS NULL:05/01/19 00:29:53 ID:???
人気通販サイトとかの方がトランザクション多いと思うけど、
バキュームなんて日に1回程度だろ。
なんか違うところがおかしいはず。

147 :NAME IS NULL:05/01/19 01:00:26 ID:???
>>144
PostgreSQLスレじゃなく、データモデリングに関するスレで聞いたほうがいいよ

148 :NAME IS NULL:05/01/19 04:29:43 ID:???
>>141
どうやってa 〜 z に1 〜 26 を割り当てているのかによる。
alpha text,no int2
というテーブルhogeが合ってalphaにa 〜 z、numberに1 〜 26を入れると仮定した場合
Xだけずらすには
update hoge set no = ((no - 1 + X) % 26) + 1

テーブルの仕様が分からないと、正確な事は言えんから、残念。


149 :141:05/01/19 10:17:38 ID:???
>>148
例が悪かったです。すまん。ローテートではなく、

a,b,c,d

の c を 1 個上にソート

a,c,b,d

そして、b を 2 個上にソート

b,a,c,d

のようなことです。
これを実現するためにテーブルはおっしゃる通り

alphabet text, no int

で、 order by no したい、ということです。

c を 1 個ソートは b と c の 2 回の update で済むが、
b を 2 個ソートだと 3 回 update、
これが z を a だと 26 回 update ですよね。
これを 148 のようにクールに書く方法はないかな、と。


150 :NAME IS NULL:05/01/19 10:41:50 ID:???
>>144
スレ違いすみませんが
これの実装方法気になる。
この話題、別のとこで再開してるのなら誘導お願いしますー

151 :132:05/01/19 11:42:51 ID:???
私も知りたいです

152 :NAME IS NULL:05/01/19 11:52:08 ID:???
>>149
移動位置にあるアルファベットの数字を移動するアルファベットに割り当て
それ以降(ソートによっては以前)〜移動するアルファベットの間にある数値を
+1すればよいんじゃないか?一回じゃ無理だけど。2,3回か。

でも何を使ってPostgreSQLを操作しているか知らないけどスクリプト等で
文字列で、検索、切り取り、挿入をしたほうが簡単じゃないか?


153 :NAME IS NULL:05/01/19 11:57:03 ID:???
>>145-146
ECサイトなら分100アクセスはあっても
同一商店(この場合テーブルを指す)から1分当たり
100商品1000在庫が変動するなんてことはないでしょ。

154 :NAME IS NULL:05/01/19 12:00:27 ID:???
>>152
つうか
alphabet text, no int, prev int, next int
として前後のnoを格納しておけばあらゆる異動は2UPDATEで済む。


155 :NAME IS NULL:05/01/19 12:04:36 ID:???
>>150
いつどれが何個売れたとか何個入庫したとかという情報も必要かな。
だから、入出庫履歴テーブルを用意してそこに記録する。
現在の在庫量を算出するには、
SELECT * FROM ネジマスター LEFT JOIN (SELECT ねじコード,sum(入出庫量) FROM 入出庫履歴 GROUP BY ねじコード)AS foo USING(ねじコード);
見たいな?

このままほっとくと、入出庫履歴テーブルが結構な行数になっちゃうので、
INSERTはいいけど、在庫量を調べる上のクエリに時間が掛かる。

そこで、定期的に(1日おきか1時間おきかは置いといて)現在庫量をそっくりそのまま在庫テーブルに
移して、出庫履歴テーブル(記録用テーブルに移すしてから?)を空にする。
後は、在庫テーブル UNION 入出庫履歴テーブルで現在庫量を求める。

MVCCのおかげでテーブルロックすることもないから、業務中でも在庫テーブル更新は行える。

で、どんなもんだろうか?
入出庫履歴にどのぐらい溜まれば、在庫量を算出するクエリが実用上問題になる時間が掛かるのかは
試してみないとわからないけど、100x60分x業務時間で5万-10万行/日ぐらいなら、何とかなりそう。
出庫(販売)前に現在庫量を調べてからって形になってたら厳しいか。

156 :NAME IS NULL:05/01/19 12:22:33 ID:???
>>152
abc(中略)xyz の y を a の次、つまり
aybc(中略)xz の場合など、移動量によって
update が比例して増えますよね。

この問は、例えば Web 画面で

<select name="item_code" size="10">
<option>item1
(略)
<option>item100
</select>

とした場合に、itemN を↑↓ボタンで並べ替えるプログラムなどの問題です。

>>154
リスト構造をすれば確かに update は 2 回ですが、
SQL で並べ替える場合 ( order by ) が難しくありませんか。


157 :NAME IS NULL:05/01/19 13:10:08 ID:???
>>153
正直、RDBでそのアクセス量は捌けないと思う。
RDBはバッチ処理系だもんで、そもそもそう使い方するもんじゃないし。
(全テーブルをオン・メモリにするとかの反則はなしでね。)

1つのASCIIフラットファイルにフォーマットを決めて全在庫を書き、
phpなりのロジックで在庫確認/増減させて書き戻す。
まあ、1行1商品の在庫数としておけばいいだろう。何行目がどの商品か
だけ厳密に決定しておけば良い。
商品が4桁程度のオーダー(1万商品程度、課題のねじなら1万種類)なら
1秒もかかるまい。
>>155氏の意見ももっともなので、受注の週間に先ず入庫/出庫データを
一定のフォーマットで残すようにしよう。1注文で1ファイル。
これも1行1商品の増減数としておけば良いだろう。これは作っていくだけだから
壊れない。万一在庫ファイルが壊れた場合は、RDBから在庫ファイルを再生成し
入出庫ファイルを順次適用すれば、現在在庫は復元出来る。

で、夜間バッチでRDBへ適用。入庫/出庫ファイルを消去し在庫ファイルと
RDBの在庫一致を確認。

在庫管理それ自身はRDBが向いていると思うので、適材適所ということで。

158 :NAME IS NULL:05/01/19 13:41:16 ID:???
>正直、RDBでそのアクセス量は捌けないと思う。


全然捌けるわけだが…

159 :NAME IS NULL:05/01/19 13:44:03 ID:???
アマゾンとかヤフオクとか、普通にそれ以上のアクセスあるだろうな。
当然中の人はRDBだろう。

Postgresと関係なくなってきてるのでこの話はここでやめで。

160 :NAME IS NULL:05/01/19 13:44:50 ID:4WtFCBLG
>>157
どんな貧弱なRDB使ってるんだ?

161 :NAME IS NULL:05/01/19 13:47:54 ID:???
昭和の時代の汎用機の話してるんじゃないの?
PCサーバにOracle入れたって、普通に同時1000とかで動かせるしな

162 :155:05/01/19 14:23:02 ID:???
このスレが該当スレになるのかな?
【より良い】データモデリング【モデルを】
http://pc5.2ch.net/test/read.cgi/db/1057509675/
普段ヲチすらしてないけど、最後の方は在庫推移のモデルって話になっているようだ。

ただ、更新の激しいテーブルは処理時間が増えてしまうというのは、
PostgreSQL特有(MVCCの実装方法による)の問題なんですよね。
UPDATEは旧データの無効化と新データの挿入になっていて、
命題の件だと1分で10倍、1時間で600倍に膨れてしまうから、
インデックスなんて全然効かない。てか、インデックス張らない方が
速いだろう。(更新も抽出も共に)

163 :NAME IS NULL:05/01/19 14:25:28 ID:???
>>160
PostgreSQLじゃないの?

164 :NAME IS NULL:05/01/19 14:48:34 ID:v3nirws7
>>156
>abc(中略)xyz の y を a の次、つまり
>aybc(中略)xz の場合など、移動量によって
>update が比例して増えますよね。

移動量がいくつだろうが条件文を書けば2回のupdate分で済むと思うのだが。
もちっと頭使え。

165 :NAME IS NULL:05/01/19 15:01:57 ID:Ua1Qg+Kc
PostgreSQL 8.0 出ました.

http://www.postgresql.org/
> PostgreSQL 8.0 Out Now

こちらは日本語記事.まだトップには出てませんけど,
センター試験にならって,2ch にリークしてみました.
http://www.postgresql.jp/ug/press-release/2005-01.html


166 :NAME IS NULL:05/01/19 15:06:14 ID:g1/lbauT
PostgreSQL8.0を話題にしないのは、波田陽区に斬られるのが怖いからですか?


167 :NAME IS NULL:05/01/19 15:08:23 ID:???
>>164
ごめん。何度読んでも素で分からないです。教えてくれますか。

168 :NAME IS NULL:05/01/19 15:36:58 ID:???
>>167
移動するアルファベットをX,数字をM
移動先のアルファベットの数字をNとおく

update hoge set no = N where alpha='X';
update hoge set no = no + 1 where N <= no and no < M and alpha != 'X';

169 :NAME IS NULL:05/01/19 15:41:25 ID:???
>>168
ああ、UPDATE"文"が2つってことか。

170 :NAME IS NULL:05/01/19 16:31:23 ID:???
> update分
スマン変換ミスだ。

171 :NAME IS NULL:05/01/19 17:23:53 ID:???
>>167
vacuumする頻度が少なくて済むようにupdate対象を少なくしたいってことか。
こっちが良く理解してなかった。148のように、ってあるからsql文を少なく
したいと勘違いしてた。スマン。

そういう条件だと、データを文字データとして一箇所に入れて、スクリプト側で
文字列操作する方法ぐらいしか思いつかない。selectの手間を考えなければ154の
リスト構造化か・・・。

172 :167:05/01/19 18:56:33 ID:???
>>171
いろいろ考えてくれてありがとうです。

173 :NAME IS NULL:05/01/19 19:54:45 ID:???
100 件あるテーブルにおいて、

update hoge set no = 2 where no = 1;
update hoge set no = 3 where no = 2;
(中略)
update hoge set no = 100 where no = 99;
update hoge set no = 101 where no = 100;

より

update hoge set no = no + 1;

の方が速いですか?それとも同じ?

174 :NAME IS NULL:05/01/19 21:15:39 ID:???
>>173
試せぼけ! って言われるよ

後者の方が早い。

関係ないけど、その例でnoがunique keyだった場合に、
結果的にはOKなはずだけど、update(後者でも)ではエラーになっちゃうんだよなあ。
これって仕方ないことなのかね。
(今手元に他DBがないからこれが当然の動作かどうかはよくわからん。)
だから今は100足してから99引くとかいんちきくさい処理をしている。

誰か俺が間違っていると指摘してくれ。


175 :NAME IS NULL:05/01/19 22:57:52 ID:???
>>174
制約の遅延が出来るのは、今のところ外部キーのみだから、仕方ないことなのかも。
8.0の正式版では試してないけど、beta2の時点ではダメだった。

176 :NAME IS NULL:05/01/20 01:07:39 ID:???
>>174
指摘したいのは山々だが・・・
俺も同じようなことでしのいだ覚えがある。

177 :NAME IS NULL:05/01/20 09:23:39 ID:???
unique key の一括update って
普通に考えたら実装に問題ありって思ってしまうけど
具体的にはどんな項目なの?

178 :NAME IS NULL:05/01/20 10:11:31 ID:???
>>177
表示順序(ORDER BY)を決めるカラムとか。
新規挿入するデータを中間にもってきたい場合、
その番号以降を+1したいなど。

179 :NAME IS NULL:05/01/20 16:04:30 ID:???
>>178
リストにしとけば、一斉書き換えはしなくて済むね。もちろんリストだと
表示時の負荷が高まるから、ケースバイケースだけど。

180 :NAME IS NULL:05/01/20 21:07:26 ID:???
>>179
ごめん。まじでわからん。
リストって何?

181 :NAME IS NULL:05/01/20 22:03:14 ID:???
>>180

リスト構造。>>154みたいな奴。

つうかここまでの議論を全然読んでないのかよ・・・

182 :NAME IS NULL:05/01/20 23:03:31 ID:???
>>181
ああ、そういうことか。ども。


183 :NAME IS NULL:05/01/21 02:01:31 ID:???
>>154みたいなリスト形式の場合ソートってどうやるの?

184 :NAME IS NULL:05/02/02 12:28:51 ID:???
すみませんが,質問です.
PostgreSQL で,「新規行挿入時の日時」「行更新時の日時」を
自動的にカラムに記録するにはどうしたら良いのでしょうか?

今の自分の考えですが,
・新規行挿入時...カラムのデフォルト値を,現在時刻の関数に
 する(どの関数にしたらよいかは分からない)
・行更新時...UPDATEに関連付けたトリガを作成する.
あたりでよいのかな?と思うのですが,どうでしょうか?

MySQL だと,timestamp 型のカラムは自動的に更新されて
くれるのですが.

以上です.どなたかよろしくお願いいたします.


185 :NAME IS NULL:05/02/02 13:52:49 ID:???
>>184
トリガで挿入・更新とも対応できるはず

186 :184:05/02/02 14:51:36 ID:xRHYLdFZ
>>185
ありがとうございます.更新系は,こんなページを見つけました.
http://ash.or.jp/db/pg_use.htm

挿入系は,テーブル定義のデフォルト値に,何か関数か予約語を
指定することで可能にはならないでしょうか?

『プログラマのためのSQL』で,そのやり方が紹介されていたので,
PostgreSQL でそのようにやってみたいのです.


187 :NAME IS NULL:05/02/02 14:59:50 ID:???
current_timestamp,current_date

188 :184:05/02/02 15:19:42 ID:???
>>187
ありがとうございます!うまく行きました.
これで MySQL から順調に乗り換えられます.


189 :NAME IS NULL:05/02/02 22:11:15 ID:???
plperl内で日本語に対して正規表現を使おうとしているのですが。
(制約に平仮名のみを許す属性を作ろうと思ってましてその前準備)
激しく文字化けします。

postgresの方から
$select version();
PostgreSQL 7.4.3 on i686-pc-linux-gnu, compiled by GCC gcc (GCC) 3.3.4 20040623 (Gentoo Linux 3.3.4-r1, ssp-3.3.2-2, pie-8.7.6)

$ show client_encoding;
UNICODE

$ show server_encoding;
UNICODE

端末(bash)のほうから
$ perl -v
This is perl, v5.8.5 built for i686-linux

$ env |grep LANG
LANG=ja_JP.UTF-8

の状態で
create or replace function testfunc4(text) returns text as '
my ($text) = @_;
$text =~tr/s/b/;
return $text;
end;' language 'plperlu';
でつくったtestfunc4という関数に対して、
select testfunc4('あ')
とやってやると
testfunc4
-----------
(激しく文字化け)
というリターンになります。
正規表現の内容($text =~tr/s/b/のぶぶん)は何をいれても変わりません。
入力がアルファベットのみの時は問題ありません。
また、正規表現の行だけを外したら問題なく動作するのですが、
何を疑ったらいいでしょうか?

190 :NAME IS NULL:05/02/02 22:20:17 ID:???
>>189
>何を疑ったらいいでしょうか?
terminalの文字コードだな。
UNICODEで吐き出されて北データをUTF-8で処理しようとして
バケてるんじゃないのかな。

191 :NAME IS NULL:05/02/02 22:35:06 ID:???
>>190
正規表現の行を削除した場合正常な値が返って来るのです。
あと、基本的にUNICODE=utf8だったような気がするのですが、、、、、

また、ほかに
create or replace function testfunc5(text) returns text as '
$test = $_[0];
if($test =~/サ/){
return ''success'';
}
else{
return ''not match'';
}
end' language 'plperl';
のばあい、select testfunc5('サイタマサイタマ');
とうてば、successと返って来るはずなのですが、
not matchしか返って来ません。

ほとんど同じ構文の

#!/usr/bin/perl --

$test = $ARGV[0];
if($test =~/サ/){
print 'success';
}
else{
print 'not match';
}
だとうまく行くのですが。

192 :NAME IS NULL:05/02/02 22:43:25 ID:G6QtGaOI
他に、
#!/usr/bin/perl
foreach my $code ( 1..65535 ) {
my $char = pack "U", $code;
my $ucs2 = sprintf "%04x", $code;
if ( $char =~ /\p{InHiragana}/ ){
print "$ucs2\t$char\n";
}
}
のばあい、正常に平仮名のリストと文字コードが返って来るのですが、

create or replace function testfunc6() returns text as'
my $result;
foreach my $code ( 1..65535 ) {
my $char = pack "U", $code;
my $ucs2 = sprintf "%04x", $code;
if ( $char =~ /\p{InHiragana}/ ){
$result.= "$ucs2\t$char\n";
}
}
return $result;
end;' language 'plperlu';

の場合、何も返って来ません。
ただし、 if ( $char =~ /\p{InHiragana}/ ){と、それに対応する}
をコメントアウトしたら、文字化けコードも大量に含みますが、
値が返って来ます。

193 :NAME IS NULL:05/02/02 23:02:53 ID:???
>>191
UNICODE≠UTF8

194 :NAME IS NULL:05/02/03 00:59:55 ID:???
DBはEUC-JP、ロケールはCにしといたほうが無難。

195 :NAME IS NULL:05/02/03 02:00:24 ID:us67hi8V
ロールケーキが何だって?

196 :189:05/02/03 04:50:07 ID:???
思考錯誤の末やっと問題解決
どうもperl5.8のユニコードの扱いの問題のようだった。
http://www.pure.ne.jp/~learner/program/Perl_unicode.html
みたいに、UTFフラグを立てた文字列に対して日本語正規表現を書けてやればうまくいくようだ。
DBのエンコーディングは、、、とりあえず、UTF8文字列とマッチさせなきゃならないので、
もうしわけないがUTFのままです。
EUC-JPでも試してみたんだけども、perlの内部処理はUTF8でやってるようで、
で、関数の作成時にどうしようかなって問題があるんで、、、、。

create or replace function testfunc5(text,text) returns text as '
use encoding ''utf8'';
my $test = $_[0];
my $wide_char = Encode::decode("utf8", $test);
if($wide_char =~/\\p{InHiragana}/){
return ''success''';
}
else{
return ''not match'';
}
end' language 'plperlu';

test2=# select testfunc5('阿あ','');
testfunc5
-----------
not match
(1 row)

test2=# select testfunc5('あ','');
testfunc5
-----------
success
(1 row)

ちなみに置換もだいたいこの応用(正規表現部分の書き換えだけ)で行けました。

197 :189:05/02/03 05:10:27 ID:???
create or replace function testfunc5(text,text) returns text as '
my $test = $_[0];
my $wide_char = Encode::decode("utf8", $test);
if($wide_char =~/^\\p{InHiragana}$/){
return ''success'';
}
else{
return ''not match'';
}
end' language 'plperlu';

間違えた。こちらのすくりぷと。
いろいろ試すためにごちゃごちゃしたのつけてて、整理して貼ってたんで
余計な物まで消してしまっていた、、、、。

198 :189:05/02/03 05:25:47 ID:???
EUC-JPのDBサーバーに対して試してみた所
\\p{InHiragana}見たいなメタタイプだと問題が起きなかったのですが、

create or replace function testfunc5(text) returns text as '
use utf8;
use encoding ''utf8'';
my $test = $_[0];
my $wide_char = Encode::decode("utf8", $test);
if($wide_char =~tr/ぁ-ん/ァ-ン){
return $wide_char.''success'';
}
else{
return $wide_char.''not match'';
}
end' language 'plperlu';
のようにじっさいにもじをうちこんでみると、ぁ-んを
クライアント側がEUC-JPでおくってみても、UTF8で送ってみても
ERROR: invalid byte sequence for encoding "EUC_JP": 0x812d
となりました。

use euc-jp
use encoding ''euc-jp'';
をつけたり外したりしてもエラー変わらず。
まあ、とりあえずUNICODEサーバーで日本語正規表現使える事確認できたので。
おいらはこれでおわりにします。。。

199 :189:05/02/03 05:36:00 ID:???
あ、正規表現の/忘れも気づきましたが、これを加えてみても結果変わらずでした。

200 :NAME IS NULL:05/02/04 18:57:52 ID:VjNijk/8
bis_test=# select round((1343/5501),9);
round
-------------
0.000000000
(1 row)

bis_test=# select round((5/1),9);
round
-------------
5.000000000
(1 row)


小数点以下になる計算をすると0になってしまいます、、、、

201 :NAME IS NULL:05/02/04 19:22:40 ID:???
>>200
どういう結果を求めているのかよくわからんのだけど

test=> SELECT ROUND(1343::FLOAT/5501::FLOAT);
round
-------
0
(1 row)

test=> SELECT ROUND(6343::FLOAT/5501::FLOAT);
round
-------
1
(1 row)

test=> SELECT ROUND((1343::NUMERIC/5501::NUMERIC), 9);
round
-------------
0.244137430
(1 row)

test=> SELECT ROUND((6343::NUMERIC/5501::NUMERIC), 9);
round
-------------
1.153063079
(1 row)

202 :NAME IS NULL:05/02/05 23:39:11 ID:???
=# select round((1343.0/5501),9);
    round
-------------
 0.244137430

203 :NAME IS NULL:05/02/07 16:00:37 ID:???
INDEXについてですが、主によく検索するキー(whereで使うキー)を
INDEXとして貼りまくってるのですが、皆さんはどのような基準で貼られているか
教えていただけますでしょうか。あまり値の変化がないものに貼っても意味がないとか
いろいろ聞くのですが、いまいちピンとこないのです。

204 :NAME IS NULL:05/02/07 21:01:30 ID:???
検索して速くなるものについて張る。
速くならないものに張ってもDML文が遅くなるだけなので張らない。


205 :NAME IS NULL:05/02/07 22:18:57 ID:???
>>204
その基準だと、ある程度の規模になると破綻しそうだな

206 :NAME IS NULL:05/02/07 22:29:59 ID:???
>>205
詳しく

207 :NAME IS NULL:05/02/07 22:39:49 ID:???
どのカラムにインデックスを貼るかは
テーブルもしくはシステム全体の設計時点で決まるってことじゃないの。

そのまま貼っても速くならないなら貼らなくていい、で済むのならいいけど、
普通速くなるような設計にするわな。

208 :204:05/02/07 22:50:35 ID:???
>>205

>>203 程度のレベルではそれくらいの説明で十分だろう。



209 :NAME IS NULL:05/02/07 23:34:26 ID:???
>>208
お前みたいな先輩(上司)がだめな奴(とその結果のだめなコード)を
大量生産してるんだろうなあ。


210 :NAME IS NULL:05/02/07 23:45:53 ID:O1kAgblR
数秒おきにUPDATEかましたら
xreaにおこられちゃった▼・ェ・▼ワン♪

211 :NAME IS NULL:05/02/08 01:02:11 ID:/tyDpKiS
DELETEやUPDATEしたとき、元のデータは物理的には削除されませんよね?
そのoidを知っていればデータを見ることは出来ますか?

212 :203:05/02/08 16:18:07 ID:???
レスして頂いた皆様ありがとうございます。
商品マスタなら商品コードにPrimaryKeyを持たせたり、そういう主な部分は分かるのですが
その他の例えば、検索フォームからキーになるようなものも全部つけたほうがいいのか等、
基準がまだよく見えてないのです。explainを使ってINDEXが使われたかどうかのチェック等をして
INDEXの設計をやっていくのでしょうか?


213 :NAME IS NULL:05/02/10 11:26:53 ID:???
すみません。質問させてください。
データテーブルTable1とマスタテーブルTable2があったとして
Table1に商品Aと商品Bの商品コードが格納されていて、
マスタテーブルTable2から商品名を取得しようと思うのですが、
どのようなjoin文にすればよいのでしょうか?
select * from table1
inner join table2 on (table1.商品A = table2.商品コード)
inner join table2 on (table1.商品B = table2.商品コード)
だとエラーが出てしまいます・・・・。

214 :NAME IS NULL:05/02/10 11:52:54 ID:???
すみません。table2にエイリアスを与えることで解決しました。

215 :NAME IS NULL:05/02/10 13:59:02 ID:Qz7FoCOW
ごく基本的ですみませんが,質問です.

CSE で PostgreSQL に接続すると,システムテーブルらしきものまで
全部表示されてしまいます.

どうしたらユーザの作成したテーブルだけを表示するようにできるでしょうか?


216 :NAME IS NULL:05/02/10 14:48:45 ID:???
設定の、システムオブジェクトがどうのこうの

217 :NAME IS NULL:05/02/10 15:30:07 ID:???
>>216
ありがとうございます.
CSE の設定の「PostgreSQL」に,「システムオブジェクトを表示する」という
項目がありました.
そのチェックをはずすことで,うまく行きました.ありがとうございました.

218 :NAME IS NULL:05/02/10 16:26:32 ID:???
>>217
そんなごくあたりまえの結果報告が出来る質問者も最近見掛けなくなったな。


219 :NAME IS NULL:05/02/10 20:15:43 ID:???
>>218
ゆとり教育

220 :NAME IS NULL:05/02/10 21:39:35 ID:???
>>213
select table1.必要なカラム,table2.必要なカラム from table1,table2
where table1.商品A = table2.商品コード or table1.商品B = table2.商品コード


221 :NAME IS NULL:05/02/11 16:25:48 ID:+y2Elq3k
where句の一個目の条件しかインデックスが利かないってホント?

222 :NAME IS NULL:05/02/11 17:20:27 ID:???
ウソです。

223 :NAME IS NULL:05/02/12 12:42:36 ID:???
部内システムだし、今あるオラクルのシステムをPostgreSQLに移行を
検討しているのですが、DWH的な使い方は問題ありませんでしょうか。

OPEN OLAPとかすでに出ていますが、PostgreSQLにオラクルの
ビットマップインデックス等DWH向きの機能が無いように見えるので
気になります。

DWH的な使い方で使用感、アドバイス等お願いします。

224 :NAME IS NULL:05/02/12 13:15:50 ID:???
OracleもMySQLもPostgresも使ってるけど(Mysqlは4.1からは凍結決定した)

ビットマップインデックスやOracleTextとか
使いこなしてる人だと正直移行しないほうがいいと思う

規模を考えて何度もレスポンスやスループットを計算、テストしてみて
実用になるかどうか判断して投入するのがオープンソースのDBだと思ってくれ

ただだからと飛びつくのは止めれ

でもマシンパワーの向上とPostgresの高機能高速化で新規案件は
Postgresを採用しているケースは多い

225 :NAME IS NULL:05/02/12 15:02:50 ID:???
>>224
アドバイスありがとうございます。

>規模を考えて何度もレスポンスやスループットを計算、テストしてみて
>実用になるかどうか判断して投入するのがオープンソースのDBだと思ってくれ

それはそうですね。
OLTP系であればテストして判断します。
実際小規模ではMySQLもPostgreSQLも利用しています。

今回お聞きしたのは調べた限りではDWH系の機能がなさそうに見えたんですが、
BI系ツールも出てきたので、実際DWH系で利用されている方の意見を聞きたかった
ためです。

DWH系の機能がないのであれば、調査するまでもなくDWH系での利用は
時期早々ということになるかと思います。


226 :NAME IS NULL:05/02/12 16:01:03 ID:???
フリーのであればOpenOLAPぐらいか…?
そういえば、実務で使ってる人っている?

227 :NAME IS NULL:05/02/12 17:19:03 ID:???
フリーのプロダクトの安定性はユーザー数に単純に左右されやすいからなぁ

228 :NAME IS NULL:05/02/12 17:26:03 ID:???
フリープロダクトの安定性は、そこにつっこまれた金額に左右されるんだよ。

229 :NAME IS NULL:05/02/12 18:03:08 ID:???
フリープロダクトの安定性は、そこにつっこまれた手弁当に左右されるんだよ。

230 :NAME IS NULL:05/02/12 21:24:31 ID:???
フリープロダクトの安定性は、そこに入ったMSのツッコミに左右されるんだよ。

231 :NAME IS NULL:05/02/13 00:36:58 ID:???
フリープロダクトの安定性は、>>227-230 全てに左右されるんだよ。

232 :NAME IS NULL:05/02/13 01:52:07 ID:???
フリープロダクトの安定性は、カワイイ娘からの応援メールに左右されるんだよ。

233 :NAME IS NULL:05/02/13 02:30:09 ID:AE3EcMav
PostgreSQL 7.2.x な環境でプライマリキーのインデックスを作り直すために
--
DROP INDEX hoge_pkey;
ALTER TABLE hoge ADD PRIMARY KEY (id);
--
とやっているのですがALTER TABLEの際のインデックス作成中にpsでプロセスを確認すると関係ないテーブルのUPDATEがすべてWAITING状態なんです。
ALTER TABLEって全テーブルをロックする仕様なのでしょうか?

ちなみにアプリケーション内では明示的にLOCK TABLEはやってないです。


234 :NAME IS NULL:05/02/19 09:36:32 ID:???
1つ質問があります。
SSH経由でpgAdminIIIからリモートのDBサーバ(PostgreSQL 8.x)に
接続することは可能でしょうか?

pgAdminIIIの検証を行っているのですが、
pgAdminIIIがインストールされている端末上にある
ローカルのpostgreSQL8については接続できることを確認しています。

ご存知のかたがいれば、情報よろしくお願いします

235 :NAME IS NULL:05/02/19 18:24:16 ID:???
昨晩SSHで5432を転送して使ったよ
7だけど。

236 :NAME IS NULL:05/03/02 22:55:53 ID:IksncMCE
質問です.
PL/pgSQL で,group by で使われる集約関数を書くことはできるのでしょうか?

具体的には,複数レコードの文字列カラムを,カンマ区切りで結合した値に
まとめることのできる関数を作りたいと思っています.


237 :236:05/03/02 22:59:08 ID:IksncMCE
例をあげます.

1  'aaa'
1  'bbb'
1  'ccc'
2  'ddd'
2  'eee'

これを

1 'aaa, bbb, ccc'
2 'ddd, eee'

という集約ができるような関数を作りたいのです.
どうかよろしくお願いします.


238 :NAME IS NULL:05/03/03 00:08:08 ID:???
plpgsql 集約関数
でぐぐると幸せになれるよ。

239 :237:05/03/03 10:56:30 ID:???
>>238
素晴らしい!幸せになれました.ありがとうございます!!
http://216.239.63.104/search?q=cache:Ia4HDMAtjCUJ:cgi.www5b.biglobe.ne.jp/

http://www.postgresql.jp/document/pg732doc/reference/sql-createaggregate.html
AGGREGATE というのがあったのですね.
不慣れなもので,見つけられませんでした.すみません.


240 :237:05/03/03 10:58:16 ID:???
お礼にはなりませんが,自分の作った関数を晴らせていただきます.
まあ,先のリンク先とほとんど同じなのですが.

-- カンマ区切りで CHAR 同士を連結するストアドファンクション
CREATE OR REPLACE FUNCTION concat_comma(CHAR, CHAR) RETURNS CHAR AS '
BEGIN
IF $1 IS NULL THEN
RETURN $2;
ELSIF $2 IS NULL THEN
RETURN $1;
ELSE
RETURN $1 || '', '' || $2;
END IF;
END;
' LANGUAGE 'plpgsql';


-- カンマ区切りで CHAR の値を連結する集約関数
-- 従来の SUM などと同様に使う.
CREATE AGGREGATE CHAR_COMMA_SUM (basetype = CHAR, sfunc = CONCAT_COMMA, stype = CHAR);


241 :NAME IS NULL:05/03/03 21:13:06 ID:???
>>239
おめ。ちなみに漏れはこうやってる。

CREATE AGGREGATE array_accum (
sfunc = array_append,
basetype = anyelement,
stype = anyarray,
initcond = '{}'
);

これは http://www.postgresql.jp/document/pg801doc/html/xaggr.html に乗ってるのと全く同じで、
array_to_string()を使ってデリミタを自由に変えられるようにしてる。

SELECT a, array_to_string(array_accum(b), ', ') FROM test GROUP BY a;


242 :237:05/03/04 12:30:30 ID:???
>>241
なるほど,配列を要素に持つ PostgreSQL ならではですね.手続き型言語によくある
配列の join 関数と同じですね.ありがとうございます.

私は PostgreSQL の配列は,第一正規化に反するので好きではなかったのですが,
この使い方は面白いですね.まあ,カンマ区切りで結合するのも正規化に反するの
ですが.



243 :NAME IS NULL:05/03/06 22:53:34 ID:???
WindowsのPostgreSQL8.0でデータの自動バックアップ出来ないかな?

244 :NAME IS NULL:05/03/07 00:20:46 ID:???



245 :NAME IS NULL:05/03/07 00:24:51 ID:???
自動バックアップのバッチ組んでタスクスケジューラで…

246 :NAME IS NULL:05/03/07 16:42:57 ID:???
PostgreSQL 7.4.7 です。
テーブルの継承と外部キー制約についての質問です。内容はこれと同一なのですが、返信がもらえていないようです。

http://ml.postgresql.jp/pipermail/pgsql-jp/2004-February/015849.html

要約すると、ある基底テーブルがあって、別テーブルでそのキーを外部キーとして参照しています。
基底テーブルを継承して作った派生テーブルがあって、それに行を挿入します。
外部キー参照しているテーブルに、派生テーブルに挿入した値を挿入すると、外部キー制約違反になってしまいます。
派生テーブルには制約が継承されないのか?

自分も同じことで悩んでいて困っているので、この回答が大変気になります。


247 :NAME IS NULL:05/03/07 18:09:30 ID:???
タスクスケジューラがあったか。ありがとさん。

サービスプログラム作る必要があるかと思ったけど、そっちの方が楽だね。
後は環境変数PGUSER,PGPASSWORDに・・・(以下略)。

248 :NAME IS NULL:05/03/07 21:55:02 ID:???
>>246
継承されません。
ユニーク制約も継承されないので、
基底テーブルのカラムにユニーク制約をつけても
派生テーブルから同値を挿入することが可能だったりする。


249 :246:05/03/07 22:03:01 ID:???
>>248
やはりそうなんですか・・・
そうなると、基底テーブルを使うことによるメリットって薄そうですね。
こういった制約などが継承されるのであれば、いろんなメリットを見出せるんですけどね。

250 :NAME IS NULL:05/03/07 22:34:56 ID:???
>>249
マニュアルには将来改善される感じに書いてあるが、
継承が有用か十分注意せよとも書いてあるなw

251 :NAME IS NULL:05/03/12 14:56:30 ID:EU6oYWx7
SELECTの際、レコードの他に、ヒットした行の総数を同時に取得する方法はありますか?
開発環境としては PHP を使っています。

実はとある情報の検索画面を作っているのですが、検索結果は1画面に20件程度表示して、ページ送りが
できるようにしようと思っています。
このために LIMIT と OFFSET を使おうと思っています。
そして、検索結果として、ヒット総数も表示したいのです。
COUNT を求める SELECT とレコードを得る SELECT を別々に発行する方法以外に、なにか便利な方法は
ありませんか?

実はまだ試してはいませんが、自分で考えた方法もありまして、LIMIT を使わずに SELECT を発行して、
Pg_Num_Rows でレコード総数を取得して、Pg_Fetch_Array で取得行番号を指定して表示対象レコードを
切り出す、なんてやり方なのですが、パフォーマンス的にはどうでしょう?


252 :NAME IS NULL:05/03/12 22:02:36 ID:???
件数とかいろいろな要素があるけど、
まず、ページ送りをするまでの間に新たなレコードが
挿入された場合どうするのか、というところが重要かな。

前者の方法だと、count()を毎回やるのか、とか。

253 :NAME IS NULL:05/03/13 00:03:15 ID:???
>>252
>ページ送りをするまでの間に新たなレコードが
>挿入された場合どうするのか

トランザクション内で処理すれば問題ないでしょ。

254 :251:05/03/13 01:47:52 ID:???
>>252
ページ送りしてる間にヒット数が変わったら、表示もそれに追従する必要があります。
ですので、毎回 COUNT() を求めます。

>>253
ウェブアプリなので、一ページ切り出すごとにトランザクションは終了します。
google でページを送るような感じです。

ようするに、SQL だけで解決しようとすると、次のように

SELECT COUNT(*) FROM xxx WHERE xxxx・・・;
SELECT * FROM xxx WHERE xxxx・・・ ORDER BY xxx OFFSET xx LIMIT xx;

みたいに、COUNT取得用とレコード取得用のSQLを別々に発行することになるのかと思います。
ただ今回は、この方法にはちょっと抵抗があります。
というのは、複雑なクエリなので、1ページ切り出すごとに重い検索を 2回もやりたくないからです。
かといって

SELECT * FROM xxx WHERE xxxx・・・ ORDER BY xxx

みたいに、LIMIT しない全件取得の SQL を発行して、アプリ側で pg_fetch_array により対象範囲を
切り出す方法だと、カウントとレコードを同時に取得できるものの、無駄なレコードの転送が発生しないか
どうかが気になるのです。

ということで悩み中なのですが、アドバイスよろしくお願いします。


255 :NAME IS NULL:05/03/13 12:26:59 ID:???
>>254
>みたいに、LIMIT しない全件取得の SQL を発行して、アプリ側で pg_fetch_array により対象範囲を
>切り出す方法だと、カウントとレコードを同時に取得できるものの、無駄なレコードの転送が発生しないか
>どうかが気になるのです。

無駄なfetchは発生するだろう。で、通常ヒット数は何件くらいなの?
元のqueryの「重さ」にもよるが、それなりの時間がかかるなら全件fetchした方が
速いような気はするが。つうか試せ。

256 :251=254:05/03/14 12:20:16 ID:A/eX/gkS
検索の内容は、多テーブルの結合や文字列の部分一致検索などを含むものです。
総レコード数は 1万件前後だと思いますが、ヒット件数は最大全部、通常は数百件前後になるのではないかと思います。

子テーブルに階層構造があってテストデータを作るのが一苦労でして、あまり規模の大きなテストデータを用意しづらい
ことから、実際に両方式を試して比較しても、いまいちハッキリしないという状況です。
でも、SQL は 1回だけ発行する方式を採用してみました。
ありがとうございます。

257 :GrassWonder:05/03/14 13:09:49 ID:PmfSDFy+
postgres で SELECT した結果に対して、1からの通し番号フィールドを
付けることってできるんですかねぇ??
知ってる人居たら、教えてください!

258 :NAME IS NULL:05/03/14 13:18:09 ID:???
件数カウントと必要部分抽出の共存と言うか、
(重い)queryの2回(以上)発行を回避する方法を
皆さんどうやっているのか俺も知りたいところ。

ちなみに俺は、CREATE TABLE TEMPORARY TABLE AS SELECT...
でテンポラリテーブルを作ってから合計値と必要部分の1ページ分を
抜き出すようにしている。


259 :NAME IS NULL:05/03/14 13:25:19 ID:???
>>257
テンポラリシーケンスを作って、
SELECT nextval('temp_seq'),* FROM Table;

260 :NAME IS NULL:05/03/14 16:35:20 ID:???
テンポラリテーブルなんて使ったら、余計重くなるなんて話は無いんですか?
テンポラリテーブルはオンメモリで処理されたりするんでしょうか?

261 :NAME IS NULL:05/03/14 18:02:12 ID:???
>>260
試してみれ

262 :258:05/03/14 18:54:52 ID:???
CREATE TEMPORARY TABLE temptable AS SELECT...
だよ。何書いてたんだ俺...

>>260
メモリは有限なんで必ずオンメモリで処理されるとは限らんわな。
俺の場合50万件ぐらいから数100件を抜き出した感じだったんだけど
どのくらい速度差がでたかは忘れたが、遅くなるってことはなかった。

てか、総件数や合計値を知りたいだけじゃなくて、並べ替えとか
グループ分けをするなど、いろいろと表示方法を変えるとき
いったんテンポラリに落とした方がプログラミングしやすかったんだよぉ。

先のレスに書いたけど、効率のいい方法があるなら俺も知りたい。


263 :NAME IS NULL:05/03/15 04:57:14 ID:LMNlBsry
次のような、2つの数値カラムを持つテーブル TBL に値が入っています(値は適当です)。

ID1 ID2
1  1
1  2
1  3
1  4
2  1
2  3
2  5
2  7

このとき、ID2 にたとえば 1,2,3 の全てがある ID1 を取得する SQL はどのようになるでしょうか?

SELECT ID1 FROM TBL WHERE ID2 IN (1,2,3) GROUP BY ID1 HAVING COUNT(ID1)=3;

みたいにやると取得できるのですが、もっと単純な方法はありますか?
また逆に、1,2,3 の全てを含まない ID1 を取得する SQL はどのようになるでしょうか?


264 :NAME IS NULL:05/03/15 09:30:22 ID:???
>263
ID2がユニークならそのSQLでOKだがそうでないと1が3回とかでも引っかかっちゃうぞ。
ケータイなんでSQLは書かないけど普通セルフジョインだ罠。

265 :NAME IS NULL:05/03/15 14:43:18 ID:???
SELECT ID1 FROM TBL t0
WHERE EXISTS (SELECT * FROM TBL t1 WHERE t0.ID1 = t1.ID1 AND t1.ID2 = 1)
AND EXISTS (SELECT * FROM TBL t2 WHERE t0.ID1 = t2.ID1 AND t2.ID2 = 2)
AND EXISTS (SELECT * FROM TBL t3 WHERE t0.ID1 = t3.ID1 AND t3.ID2 = 3)
って単純じゃあねーな。

266 :263:05/03/15 23:29:14 ID:???
>>264
ID1 と ID2 の組み合わせでユニークです。

>>265
正攻法って感じですね。とりあえずはそういうアプローチが自然だと思います。
ただ、やりたいことの割にSQLが複雑になるのが難点なんですよね。
なにかSQLの便利文法や関数みたいのって無いものですかね。


267 :NAME IS NULL:05/03/16 00:17:32 ID:???
さっきまでまともに動いていたのに、
引数に平仮名カタカナ日本語が使えなくなった。

create or replace function testfunc1(text) returns text as'
declare
begin
if length($1) = 0 then raise notice ''no'';
end if;
raise notice ''%'', $1;
return $1;
end;' language 'plpgsql';

この関数で、select testfunc1('あ');
とやってやった時に文字化けやら、値がこなかったりとか。
クライアントエンコーディングは基本的に
UNICODEで、端末側はutf-8
set client_encoding to 'EUC-JP'やらで変更してやってもいじょうなし。


# show client_encoding;
client_encoding
-----------------
UNICODE
(1 row)
version
---------------------------------------------------------------------------------------------------------------------------------------------
PostgreSQL 8.0.1 on i686-pc-linux-gnu, compiled by GCC i686-pc-linux-gnu-gcc (GCC) 3.3.5 (Gentoo Linux 3.3.5-r1, ssp-3.3.2-3, pie-8.7.7.1)
(1 row)

文字化けと言うことでエンコーディング周りかなと思ったのですが、
何を疑ったらいいでしょう?

268 :NAME IS NULL:05/03/16 00:18:55 ID:???
訂正、文字コードを変えてやっても、変わり無し、です。

269 :267:05/03/16 00:23:57 ID:???
emacsからの操作をしてたのですが、一度試しにkonsole
(KDEのターミナル)から操作してみましたら、正常稼働。
で、ひょっとしてemacsのSQLモードが原因かなと思って、
emacs自体を落して、再起動させてみたら、正常稼働。

emacs側の問題でした。何が原因かはちょっとわかりませんが、、、。
すみません。

270 :NAME IS NULL:05/03/16 01:46:46 ID:???
>>269
正直にレスするのは大事なことだよね。乙。

271 :NAME IS NULL:05/03/17 12:47:08 ID:???
すみませんが,質問です.

PostgreSQL 7.3.4 で,Timestamp 型のカラムから java.sql.Date 型の
値を得たいのですが,ResultSet#getDate() だと時:分:秒が全てゼロに
切り捨てられてしまいます.

時:分:秒まで取得するためには,以下のようにするしかないのでしょうか?
new Date(ResultSet#getTimestamp("カラム名").getTime());

それとも,JDBC ドライバを変えるなどして,そのまま getDate()で
取れたりするのでしょうか?

現在使っているドライバは org.postgresql.Driver というものですが,
詳しいバージョンなどはわかりません.


272 :NAME IS NULL:05/03/17 13:41:40 ID:???
getTimeStampで取得すればいいだろ
Dateは日付だけだしTimeは時刻だけ

何もおかしい動きではないと思うが

273 :271:05/03/17 21:00:01 ID:???
>>272
ありがとうございます.これが PostgreSQL の仕様なのですね.
PostgreSQL の TIMESTAMP 型は,MySQL だとDATETIME 型になりますが,
それの ResultSet#getDate() は時:分:秒を切り捨てませんので,
PostgreSQL も同様だと思っていました.

new Date(ResultSet#getTimestamp("カラム名").getTime());

この書き方は,耐えられないというほどでもありませんが,やや冗長です.
もう少しきれいな書き方はないものか,とは思います.


274 :NAME IS NULL:05/03/17 21:14:24 ID:???
>>273
3種類ともDateを継承してるからな
実装によっては余計なのもはいるのかもしれないが、入ってる部分を期待するのはどうかと思うぞ

あとそんな冗長な書きかたしなくてええ

275 :271:05/03/18 11:22:26 ID:???
>>274
ああそうか,受け手の setter の引数を,java.util.Date 型にすれば,
Timestamp 型をそのまま渡せるのですね.
困ったな,今まで気づかずに,どのメソッドも java.sql.Date 型にして
しまってます.
まあ,何とかします.ありがとうございました.


276 :NAME IS NULL:05/03/19 13:43:54 ID:???
create or replace function testfunc1(arg_text text,arg_rec test1) returns test1 as'
declare
res_r_return record;
begin
raise notice ''%,%'',arg_rec.i1,arg_rec.t1;
select into res_r_return arg_rec.i1,arg_text;
return res_r_return;
end;' language 'plpgsql';

こういう関数と、
create table test1 (i1 int,t1 text);
と言うテーブルを用意しまして、
select b.* from (select testfunc1 ('saitama',a) from (select * from test1) as a) as b;

みたいなことやってみたいんですが、テーブルでキャストするみたいなことできないんでしょうか?
できれば、(select * from test1) as a の部分はまた別のSQLを書くことになるのですが、
このままだと、ERROR: plpgsql functions cannot take type record
と言うエラーになってしまいます。

ですので、test1のテーブルでキャストしたいのです
なお(select * from test1) as a を test1 as a にすればうまく行きますが、
これだと、「こちらで用意した複合型を引数にさせる」と言う目的が果たせないので、、、。

86 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)