PostgreSQL

全1193件中121~140件表示
  • 行ロックについて

    Web上のボタンをクリックしたとき 該当データを1件取得しそのデータにフラグをたてる ⇒フラグを管理するテーブルに投入する という処理をしており該当データは一人につき1件取得したいです。 BEGIN SELECT * FROM TABLE1 WHERE day = 今日 ORDER BY time LIMIT 1 FOR UPDATE UPDATE TABLE1 SET flag = 1 WHERE id = $id INSERT INTO TABLE2 (time , flag ) VALUES ($time , 1); COMMIT 現在の問題は同時にボタンを押したとき SELECTで取得したデータが重複してしまうことがあることです。 BEGINからCOMMITまでを一連の流れとし、 その間はSELECTもできないようにしたいです。 ドキュメントに FOR UPDATEだとUPDATE、DELETE、SELECT FOR UPDATEは拒否されます とありますのでSELECTは通ると解釈するとFOR UPDATEでは実現できないのでしょうか? テーブルのロックではなく行のロックで実現したいのですが どなたかご教授お願い致します。 ※バージョンはPostgreSQL 8.1.18 です。

  • SQLで同じフィールドを2つ取りだしたい

    以下のテーブルからCSVを出力する際、 ID | 名称 | コード1 | コード2 1 |  A  |  111  |  444 2 |  B  |  222  |  555 3 |  C  |  333  |  666 「ID/名称/コード1コード2」のように取りだす場合のSQL文は SELECT ID, 名称, コード1 || コード1 FROM テーブル名 となると思いますがこれを、「ID/名称コード1/名称コード2」のように同じフィールドを同じ行に2回登場させたい場合はどうすれば宜しいでしょうか。 SELECT ID, 名称 || コード1, 名称 || コード2 FROM テーブル名 とした場合にはエラーになってしまいます。 宜しくお願い致します。

  • SQLのINDEX名

    素朴な疑問ですが、教えてください。 SQLのcreate index構文は「create index idx on table(id);」ですが、 そもそも、なぜindex名をこちらが名前を指定するようになっているのでしょうか。 別にシステム側で決めても良い気がします。delete index するときも 列名を指定する仕組みにして、列名に張られたindexを削除する仕組みにすればいいのにと 思います。 よろしくお願いします。

  • 複数レコードのテーブルであるレコードだけ増やしたい

    お世話になります。 複数レコードがあるテーブルにて、あるレコードだけカウントアップする為のSQL文はどのように記述すれば良いでしょうか? 要件: テーブル名'名簿'の No, 名前, 更新者, 備考に 01, 芥川龍之介, ほげ太, NULLを入力し 備考は書き込みさせるためとりあえずNULLを代入しておき 名前と更新者は同じで、Noの部分だけを01~10までカウントアップさせたい 何卒、ご教授のほど、宜しくお願いします。

  • ポスグレ レコードの比較

    ポスグレDBで以下のような二つのテーブルがあって レコード数、カラム等の構造も同じだったとして カラム1の値が二つのテーブルで同じであり カラム2~4のうちどれか一つでも違うレコードを抽出するSQLがわかりません。 下記の例で言うと抽出結果がスキーマA.テーブルAの「←」のレコードを抽出したいです。 スキーマA.テーブルA カラム1|カラム2|カラム3|カラム4| --------------------------- A |aaaaaaa|bbbbbb|ccccccc --------------------------- B |aaaaaaa|bbbbbb|ccccccc      ← --------------------------- C |aaaaaaa|bbbbbb|ccccccc      ← --------------------------- D |aaaaaaa|bbbbbb|ccccccc      ← --------------------------- E |aaaaaaa|bbbbbb|ccccccc スキーマB.テーブルB カラム1|カラム2|カラム3|カラム4| --------------------------- A |aaaaaaa|bbbbbb|ccccccc --------------------------- B |1111111|bbbbbb|ccccccc --------------------------- C |aaaaaaa|777777|ccccccc --------------------------- D |2222222|bbbbbb|8888888 --------------------------- E |aaaaaaa|bbbbbb|ccccccc よろしくお願いします。

  • PostgreSQL LOCK TABLE

    はじめまして、小澤と申します。 PostgreSQL はあまり使う機会が無かったので、 実務期間数か月の初心者です。 数年前に作成されたサイトのメンテナンスをしております。 本番環境の DB は、更新することが出来ないので、 ローカルに開発環境を作って、修正作業を行っています。 本番環境と開発環境の、PostgreSQL のバージョンの違いによって 困っています。 PHP で、「LOCK TABLE ~ 」という処理があるのですが、 本番環境は問題なく実行できますが、開発環境で、下記のエラーがでます。 SQL エラー: ERROR: LOCK TABLEはトランザクションブロック内でのみ使用できます LOCK TABLE をトランザクションの BEGIN と COMMIT の中に 入れなさい、ということおt思います。 本番環境は、Linux バージョンは 7.3.4 開発環境の、Windows バージョンは 8.4.4 7.3.4 の頃には、トランザクション処理が無かったのか、 LOCK TABLE との関係が定義されてなかったのかもしれません。 開発環境の PostgreSQL のバージョンを 7.3.4 にしようと思い、 探したのですが、Windows 版はもう無いようです。 下記のことを教えて下さい。 1.開発環境の PostgreSQL の設定で、このエラーを出ないようにする 方法はないでしょうか。 2.Windows 版の PostgreSQL のバージョンを 7.3.4 が、 どこかにないでしょうか。 尚、ソースにトランザクション処理を追加するという方法も考えましたが、 修正箇所が多いので、難しいです。 メーリングリストにも出してます。マルチキャストですみません。 以上、宜しくお願いします。

  • SQL 表の結合

    SQLで2つの表から条件に合ったデータを取り出し、同じ列に表示させたいのですが、 どうやっても外部結合のようにすることしかできませんでした。 取り出したデータを縦に結合?させることはできるのでしょうか? 例) dataは月の上旬中旬下旬でそれぞれabcとします。 入力値はmonthとdayで、これらからuriageを選択します。 dataの取りうる値はa,b,c,ab,bc,abcとします。    table:A 売上表            table:B 上旬中旬下旬判断 ---------------------------   -----------  key | data | month | uriage   day | data ---------------------------    -----------   1 |  a  |  1  |  500      1 |  a   2 |  ab  |  1  |  800     … |  …   3 |  bc  |  1  |  400     10 |  a   4 |  c  |  1  |  100     11 |  b   5 |  abc |  1  |  900     … |  …   … |  …  |  …  | …     31 |  c ---------------------------    ----------- month = 1 , day =5のとき  table:Bより   SELECT data FROM table:B WHERE day = 5 としてdata "a" を得ます。 この"a"と同じdataを持つuriageを表示させたいので   SELECT uriage FROM table:A   WHERE month = 1 AND data = (SELECT data FROM table:B WHERE day = 5) として  table:query1  --------    uriage  --------    500  -------- を得ました。 ここまでは良いのですが、これに付け加えて、 table:Bから取り出したdata "a"をtable:Aのdataが含むとき(data = a,ab,abcのとき) その全てのuriageを表示させたく、 ワイルドカードを使おうと   SELECT uriage FROM table:A   WHERE month = 1 AND data = %(SELECT data FROM table:B WHERE day = 5)% 等としてみたのですが、上手くいきませんでした。 そこで、別のクエリーを作って   SELECT uriage FROM table:A   WHERE month = 1 AND data = 'ab' AND data = 'abc' として  table:query2  ---------   uriage  ---------    800  ---------    900  ---------- を得ました。 そして、最後に、 得られた2つの表をまとめて  ---------   uriage  ---------    500  ---------    800  ---------    900  --------- としたいのですが、   SELECT uriage, uriage FROM query1, query2 とすると  ------------------   uriage | uriage  ------------------    500  |  800    500  |  900  ------------------ となりますし、UNIONは使い方がよくわからないためシンタックスエラーにしかならず...。 そもそも、縦に結合?はできるのでしょうか??? あれこれ試してみたのですが、詰まってしまったので、 どなたか知恵をお貸しください。

  • SQL,値の大きい順に値を取得

    質問させて頂きます。 DB:PostgresSQL 言語:PHP 現在仕事情報の入ったテーブルから、金額の高い順にデータを10件取り出したいと考えています。 金額の入ったカラムが1つであれば、order by句で取り出すのですが、今回、時給[hour]、月給[month]、年収[year]と3つのカラムが存在しています。 ※下記のid4のように2つ以上の金額情報カラムを持っているデータも存在します。 ※データの中にはnullでなく0が入っているデータも存在します。 [id][hour][month][year] 1 ,1000 ,null ,null 2 ,1200 ,0 ,0 3 ,null ,300000 ,null 4 ,1500 ,200000 ,null 5 ,null ,null ,3200000 ... 100,null ,250000 ,null 質問の内容なのですが、下記のルールに従いデータを取得する際、どのような方法を行えば一番効率的でしょうか。 「ルール」 1. 金額比較の際、 月給はそのまま、 年収は12で割った金額、 時給に関しては、時給×8(1日の平均的労働時間)×20(1月の平均的な労働日数)の金額とします。 2. 2つ以上のカラムに金額を持っていた際は(id4のようなデータ)、金額の大きさに関わらず、年収>月給>時給の順で取得する。 id4のデータならば、時給の方が月給より高いですが、月給のデータを使用します。年収があれば年収優先。 id2の場合、0はnullと同じ扱いと考え、時給のデータを使用します。 このルールをふまえたうえでデータを取得する際、SQLで全データを取得して、PHPで高い順を判定するべきか、SQLで取得する時点である程度絞って取得した方が良いのか・・・。 SQLに関しての知識が乏しいため、効率的な方法をご存知の方はアドバイス頂けると大変助かります。 よろしくお願いします。

  • SQL文で質問があります。

    商品マスタがあり、データは下記の感じで登録されています。  コード | 商品名  | 商品カナ | 分類コード ・・・ ---------------------------------------------------------  0001  | マウス  | マウス  | 01     ・・・  0002  | キーボード| キーボード| 01     ・・・  0003  | モニター | モニター | 01     ・・・          ・          ・          ・ SQL文で質問があります。 下記のSQLでは取得できるんですが・・・ SELECT * FROM M_SHOHIN WHERE code = ANY('{0001,0002,0003}'); 下記のSQLを実行したらエラーが出力されました。 SELECT * FROM M_SHOHIN WHERE code = ANY(  SELECT ARRAY_AGG(code) AS code FROM M_SHOHIN WHERE class_code = '01' ); ERROR: operator does not exist: character varying = character varying[] HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts. なので下記のようにCASTをするようにして実行したらエラーは出力されなくなりましたがデータの取得ができませんでした。 SELECT * FROM M_SHOHIN WHERE code = ANY(  SELECT CAST(ARRAY_AGG(code) AS VARCHAR) AS code  FROM M_SHOHIN WHERE class_code = '01' ); どのようにすれば取得できますでしょうか。 説明が下手で申し訳ありませんがアドバイスいただけませんでしょうか。 データベースはPostgreSQL 8.4.9です。 宜しくお願いします。

  • DBのバックアップとログの退避方法について

    業務システムでPostgreSQL8.3を利用しており日次でバックアップを行っています。しかし、もしシステム稼動中にサーバー障害が発生した場合、データの復旧可否が利用者にとって一番気になるところだと思います。(日次バックアップは実施しているので前日データまでは復旧できると思います。) そこで質問なのですが、最新データまで復旧するとなるとログデータが必要になると思いますが、サーバが何らかの障害でログデータすらサルベージできない状況が起きることを想定して、ログデータも別のサーバに常に退避するように設定することは可能でしょうか?(無知ですみません) 可能な場合、PostgreSQLにおける上記の具体的な実施方法を教えて頂けないでしょうか?(お恥ずかしい限りではありますが、そもそもこの方法が妥当かどうかも判断できていないです) 上記の中で、質問者はデータベースのことを分かっていないと判断されましたら、合わせてアドバイス・一般論なども頂けると幸いです。 何卒、よろしくお願いします。

  • 複数行の上位3位を1行に表示

    複数行の上位3位を1行に表示する。 分かる方がいれば教えて下さい。 OS:Windows7 DB:PostgresSQL 8.3 <参照デーブル> 品番  ID   金額    日付 1;    3;   1000000; "2012-08-31" 1;    2;   970000;  "2012-08-18" 1;    1;   970000;  "2012-08-10" 1;    4;   940000;  "2012-08-20" 2;    16;  300000;  "2012-08-25" 2;    13;  300000;  "2012-08-13" 2;    12;  250000;  "2012-08-10" 2;    15;  250000;  "2012-08-18" 2;    14;  200000;  "2012-08-15" 2;    11;  200000;  "2012-08-08" 上記の様なテーブルを、金額が高くかつ時間の速いもの順で、上位3位を1行に表示したいのですが、上手くいかずに困っています。 <抽出したい結果> 品番  ID1   金額1    ID2  金額2   ID3   金額3 1;    3;    1000000;  1;   970000;   2;   970000 2;    13;    300000;  16;  300000;   12;   250000 このように抽出しいたいのですが上手くいきません。 どなたか教えていただけいないでしょうか。 よろしくお願いします。

  • PostgreSQLと、AccessをODBC接続

    PostgreSQL初心者です。 AccessからPostgreSQLに移行しようと思い、ODBCで接続しようとしたのですが、エラーが発生して進めません! そして、いろいろ試してみたのですが、同じエラーが発生してしまいます。 設定、エラー内容は、下記になります。 エラー内容 「ODBC--呼び出しが失敗しました。 Could not connect to the server; Could not resolve hostname.(#101)[Microsoft][ODBC Driver Manager]ドライバのSQLSetConnectAttrは失敗しました。(#0)」 設定 データソース(ODBC)→システムDSN→PostgreSQL Driver Setup Database Server dbserver User Name localhost Description Port 5432 以上、宜しくお願い致します。 OS:WindowsXP Professional Version 2002 Service Pack3 PostgreSQL 9.1 Version 1.14.3 Access XP(2002) になります。

  • 集計の方法について

    下記のようなテーブル(tbl)があり Code Name ------------ A1   A-1 A1   A-2 A1   A-3 B1   B-12 B1   B-13 C1   C-9 以下の結果を取得したいのですが Code Name ------------ A1 A-1 B1 B-12 C1 C-9 です。Accsessでは SELECT Code, First(Name) FROM tbl GROUP BY Code; などと書けるのですがPostgresSQL V9.1ではどのように書けばよいのでしょうか? Window関数かと思いますが、旨く結果が得られません。 初歩的な質問で申し訳ありませんが、教えていただけませんか?

  • plpgsqlでのbyte数指定での文字切り出し

    postgresql(plpgsql)にて、byte数指定での文字列切り出しを行いたいのですが、よい手法などありませんか? substr(substring)だと、文字数の指定となり、対象がマルチバイト、シングルバイト文字混在だと意図した値が取得できません。 ※Oracleのsubstrbに相当するものです。 ※select substr(カラム, 1, 20) from ...的な取得がしたいです。 よろしくお願いします。

  • 外部プログラムを実行する方法について

    お世話になります。 データが更新された段階で、外部プログラム(xxx.exe)を実行したいと考えております。 おそらく、トリガを利用すれば可能かと思い調査しておりますが、 どのようにして外部プログラムを実行すればよいか分かっておりません。 ご存知の方、ご教示頂けないでしょうか。 よろしくお願いいたします。

  • postgresqlにて全レコードのupdate

    PostgreSQLの全レコードを順次Updateしたいのですが、 SQLの記述方法がわかりません。 [やりたいこと] ユーザ情報を保持しているテーブルに、新しく"ID_TMP"カラムを追加。 カラム"ID_TMP"に、ユーザIDを保持しているカラム"ID_INFO"の内容を書き込む。 コピーしたいレコードが単一の場合、次のSQLで可能だと思うのですが、 テーブルに保持している全レコードを順次処理する方法を教えてください。 update [テーブル名] set ID_TMP = (select ID from [テーブル名] where id = [ID名]); 宜しくお願いいたします。

  • 行の結合?

    こんにちは。 SQLについて質問です。 id  name  goal 1  山田  東京 2  木下  北海道 3  高橋  大阪 3  高橋  沖縄 こういう状態でデータが入っていたとして、 idが3の高橋はgoalが違う状態で2件データがあります。 これを、 id  name  goal 1  山田  東京 2  木下  北海道 3  高橋  大阪、沖縄 こうなるようにしたいのですが、 どうSELECT文を書けばよいでしょうか? よろしくお願いします。  

  • vb.netからpsqlコマンドを実行するには

    DBサーバー:Linux、Postgresql 8.4.9 クライアント:Windows7 pro、vb.net 2010 にて開発を行っております。 ■経緯 copyコマンドを使用して、クライアントにあるcsvファイルのデータを DBテーブルに一括登録したいと考えております。 まず、「COPY table FROM 'csvファイルパス' 」で試したところ、  ファイル経由のCOPY FROM、COPY TOを行うにはスーパーユーザでなければなりません  標準入出力経由のCOPYは誰でも実行可能です。またpsqlの\\copyも誰でも実行できます 旨のエラーが返ってきた為、下記の方法を考えております。 ■質問内容 psqlからのcopyにより、登録を行おうと考えている。 その際に、vb.netからpsqlコマンドの実行がそもそも可能なのかどうか、 (Linux上のpsqlコマンドなのだから、vb.netから実行できない?) 根本的なところからの質問となってしまいますが よろしくお願いいたします。 また、上記実装を開設してるサイトなどもございましたら、 ご教授願います。よろしくお願いいたします。

  • psqlの一部でエラー

    あるサーバーにDBのダンプをインポート仕様としています psql - U postgresで接続できていることは確認してあります psql -h localhost -U postgres -f xxxxxx.dump xxxxxx とうつとIdent authentication failed for user "postgres"とFATALが出て インポートかでません pg_hba# TYPE DATABASE USER CIDR-ADDRESS METHOD # "local" is for Unix domain socket connections only local all all trust # IPv4 local connections: host all all 127.0.0.1/32 ident # IPv6 local connections: host all all ::1/128 ident.confには下記になってます どうしてでしょうか?

  • PostgreSQLの差分バックアップに関して

    よろしくお願いいたします。 ■経緯 Linuxサーバ & PostgreSQL 8.4.9 において開発を行っております。 データベースを日時でバックアップをとる案件がございまして、 pg_dumpでは差分バックアップができないことが判りました。 ネット等でも検索したところ、 「 PostgreSQL 8.0 以降では、前回バックアップした内容からの差分バックアップ、 特定時間までの巻き戻しが可能です 」 との書き込みも見つけたのですが、具体的な方法を調べてみたのですが、 目的の情報に、いまだたどり着いておりません。 ■質問内容 当然、私どもの使用するデータの種別、内容、に寄るところではありますが PostgreSQLを差分バックアップを取る場合に、 一般的にどのようなバックアップツール?(WAL?pg_rman?)を使用して、 差分を抽出しているのか、参考に教えていただけますでしょうか。 また具体的なコマンドの使用方法等を解説しているページなどもありましたら よろしくお願いいたします。